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.