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


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(); }

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')
> 

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

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é.


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"


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


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)


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.