Supprimer la sortie d'une fonction

90

Je cherche à supprimer la sortie d' une commande (dans ce cas, la applyfonction).

Est-il possible de faire cela sans utiliser sink()? J'ai trouvé la solution décrite ci-dessous, mais j'aimerais le faire en une seule ligne si possible.

Comment supprimer la sortie

Tor
la source
2
Pouvez-vous expliquer ce que vous entendez par «faire ceci en ligne»? Sinon, la question que vous citez fournit déjà la réponse et c'est un double.
Dirk Eddelbuettel
1
Cette solution nécessite trois lignes, une sortie de redirection, la commande, puis une autre pour réactiver la sortie.
Tor
8
Ou utilisez capture.output. Ou utilisez à *_plypartir du package plyr.
hadley
1
Je seconde la suggestion de Hadley - si vous essayez vraiment d'exécuter une fonction apply, telle que lapply, sans imprimer la sortie, alors «l_ply» de son plyrpaquet est probablement le choix le plus approprié.
Sharpie

Réponses:

92

Il n'est pas clair pourquoi vous voulez faire cela sans sink, mais vous pouvez encapsuler toutes les commandes dans la invisible()fonction et cela supprimera la sortie. Par exemple:

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

Sinon, vous pouvez toujours combiner les choses en une seule ligne avec un point-virgule et des parenthèses:

{ sink("/dev/null"); ....; sink(); }
Shane
la source
5
Essayez 'invisible (cat ("Hi \ n"))' - invisible()ne supprime que l'impression d'une expression, ce n'est pas une ligne sink()unique.
Dirk Eddelbuettel
2
Oui, mais je pense que cela répond aux besoins de l'interrogateur, à moins que je ne manque quelque chose dans la question ...
Shane
1
Par exemple, cela supprime le retour de apply, selon la question: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane
Plutôt que de { sink("/dev/null"); ....; sink(); }préférer capture.output, comme capture.outputle fait effectivement exactement ci-dessus, juste beaucoup mieux (regardez la source, elle appelle évier comme ci-dessus, plus quelques trucs sympas autour d'elle).
Cookie du
3
ne fonctionne pas sur la idwfonction sous Windows. Je pense que la meilleure solution est d'utilisersink
TMS
58

Utilisez la capture.output()fonction. Cela fonctionne très bien comme un seul sink()et contrairement invisible(), il peut supprimer plus que simplement imprimer des messages. Définissez l'argument de fichier /dev/nullsur UNIX ou NULsous Windows. Par exemple, compte tenu de la note de Dirk:

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

> capture.output( cat("Hi\n"), file='NUL')
> 
Sharpie
la source
10
ne fonctionne pas si vous voulez l'appliquer à une fonction qui renvoie une valeur et que vous voulez utiliser cette valeur
TMS
8
@TMS Quelque chose a-t-il changé au cours des derniers mois? Je viens de tester pour utiliser la valeur retournée par une fonction et cela a fonctionné ... capture.output(x <- log(2))et a ensuite xla valeur de log(2)...
drmariod
10

vous pouvez utiliser 'capture.output' comme ci-dessous. Cela vous permet d'utiliser les données plus tard:

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

test$betas
Kristy
la source
9

R n'imprime automatiquement que la sortie des expressions non attribuées, donc affectez simplement le résultat de l applyà une variable et il ne sera pas imprimé.

Aniko
la source
4
Certaines fonctions contiennent un print()ou cat()qui va à l'écran, pas à une affectation.
keithpjolley
9

La fonction suivante doit faire exactement ce que vous voulez:

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

Par exemple avec la fonction ici:

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

fonctionnement

x = hush(foo())

Attribuera 42 à x mais n'imprimera pas "BAR!" à STDOUT

Notez que dans un système d'exploitation UNIX, vous devrez remplacer "NUL" par "/ dev / null"

Danny
la source
C'était la seule réponse qui faisait ce dont j'avais besoin, sous-estimée.
tomka
exactement ce dont j'avais besoin aussi
gaspar
3

Si quelqu'un arrive ici à la recherche d'une solution applicable à RMarkdown, cela supprimera toutes les sorties:

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

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


})})
```

Le code s'exécutera, mais la sortie ne sera pas imprimée dans le document HTML

stevec
la source
1

Faire le commentaire de Hadley à une réponse (espérer la rendre plus visible). L'utilisation de la famille Apply sans impression est possible avec l'utilisation du plyrpackage

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

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

Créé le 2020-05-19 par le package reprex (v0.3.0)

Tjebo
la source
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))

produit une sortie sans NULL à la fin de la ligne ou sur la ligne suivante

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
Bryan King
la source