Suprime a saída de uma função


91

Estou tentando suprimir a saída de um comando (neste caso, a applyfunção).

É possível fazer isso sem usar sink()? Encontrei a solução descrita abaixo, mas gostaria de fazer isso em uma linha, se possível.

Como suprimir a saída


2
Você pode explicar o que quer dizer com 'fazer isso embutido'? Caso contrário, a pergunta que você cita já fornece a resposta e esta é uma duplicata.
— Dirk Eddelbuettel

1
Essa solução requer três linhas, uma redirecionando a saída, o comando e outra para reativar a saída.
— Tor

8
Ou use capture.output. Ou use *_plydo pacote plyr.
— hadley

1
Eu concordo com a sugestão de Hadley - se você está realmente tentando executar uma função de aplicação, como lapply, sem imprimir a saída, então 'l_ply' de seu plyrpacote é provavelmente a escolha mais apropriada.
— Sharpie

Respostas:


93

Não está claro por que você deseja fazer isso sem sink, mas você pode agrupar quaisquer comandos na invisible()função e isso suprimirá a saída. Por exemplo:

1:10 # prints output
invisible(1:10) # hides it

Caso contrário, você sempre pode combinar as coisas em uma linha com um ponto e vírgula e parênteses:

{ sink("/dev/null"); ....; sink(); }

5
Tente 'invisível (cat ("Hi \ n"))' - invisible()apenas suprime a impressão de uma expressão, não é uma linha sink()única.
— Dirk Eddelbuettel

2
Certo, mas acho que atende às necessidades do questionador, a menos que esteja faltando alguma coisa na pergunta ...
— Shane

1
Por exemplo, este suprime o retorno de apply, de acordo com a pergunta: invisible(apply(matrix(1:10), 1, as.numeric)).
— Shane

Ao invés de { sink("/dev/null"); ....; sink(); }eu definitivamente preferir capture.output, como capture.outputefetivamente faz exatamente acima, apenas muito melhor (dê uma olhada na fonte, ele chama de sink como acima, além de algumas coisas legais em torno dele).
— Cookie de

3
não funciona em idwfunção no Windows. Acho que a melhor solução é usarsink
— TMS

58

Use a capture.output()função. Funciona de forma muito semelhante a uma única sink()e invisible(), ao contrário , pode suprimir mais do que apenas imprimir mensagens. Defina o argumento do arquivo como /dev/nullno UNIX ou NULno Windows. Por exemplo, considerando a nota de Dirk:

> invisible(cat("Hi\n"))
Hi

> capture.output( cat("Hi\n"), file='NUL')
> 

10
não funciona se você deseja aplicar isso a uma função que retorna algum valor e deseja usar este valor
— TMS

8
@TMS Algo mudou durante o último mês? Acabei de testar usar o valor retornado por uma função e funcionou ... capture.output(x <- log(2))e depois xtem o valor de log(2)...
— drmariod

10

você pode usar 'capture.output' como abaixo. Isso permite que você use os dados mais tarde:

log <- capture.output({
  test <- CensReg.SMN(cc=cc,x=x,y=y, nu=NULL, type="Normal")
})

test$betas

10

A função a seguir deve fazer exatamente o que você deseja:

hush=function(code){
  sink("NUL") # use /dev/null in UNIX
  tmp = code
  sink()
  return(tmp)
}

Por exemplo, com a função aqui:

foo=function(){
  print("BAR!")
  return(42)
}

corrida

x = hush(foo())

Irá atribuir 42 ax, mas não imprimirá "BAR!" para STDOUT

Observe que em um sistema operacional UNIX você precisará substituir "NUL" por "/ dev / null"


Esta foi a única resposta que fez o que eu precisava, subestimada.
— tomka

exatamente o que eu precisava também
— gaspar

9

R apenas imprime automaticamente a saída de expressões não atribuídas, então apenas atribua o resultado de a applyuma variável e ele não será impresso.


4
Algumas funções têm um print()ou cat()que vai para a tela, não para uma atribuição.
— keithpjolley

3

No caso de alguém chegar aqui em busca de uma solução aplicável ao RMarkdown, isso irá suprimir todos os resultados:

```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({

# Your code goes here
2 * 2
# etc
# etc


})})
```

O código será executado, mas a saída não será impressa no documento HTML


1

Fazendo o comentário de Hadley a uma resposta (espero torná-lo mais visível). O uso da família de aplicação sem impressão é possível com o uso da plyrembalagem

x <- 1:2
lapply(x, function(x) x + 1)
#> [[1]]
#> [1] 2
#> 
#> [[2]]
#> [1] 3

plyr::l_ply(x, function(x) x + 1)

Criado em 2020-05-19 pelo pacote reprex (v0.3.0)


0
invisible(cat("Dataset: ", dataset, fill = TRUE))
invisible(cat(" Width: " ,width, fill = TRUE))
invisible(cat(" Bin1:  " ,bin1interval, fill = TRUE))
invisible(cat(" Bin2:  " ,bin2interval, fill = TRUE))
invisible(cat(" Bin3:  " ,bin3interval, fill = TRUE))

produz saída sem NULL no final da linha ou na próxima linha

Dataset:  17 19 26 29 31 32 34 45 47 51 52 59 60 62 63
Width:  15.33333

Bin1:   17 32.33333
Bin2:   32.33333 47.66667
Bin3:   47.66667 63
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.