Sto cercando di sopprimere l'output di un comando (in questo caso, la apply
funzione).
È possibile farlo senza utilizzare sink()
? Ho trovato la soluzione descritta di seguito, ma vorrei farlo in una riga se possibile.
Sto cercando di sopprimere l'output di un comando (in questo caso, la apply
funzione).
È possibile farlo senza utilizzare sink()
? Ho trovato la soluzione descritta di seguito, ma vorrei farlo in una riga se possibile.
capture.output
. Oppure usa *_ply
dal pacchetto plyr.
lapply
, senza stampare l'output, 'l_ply` dal suo plyr
pacchetto è probabilmente la scelta più appropriata.
Risposte:
Non è chiaro il motivo per cui vuoi farlo senza sink
, ma puoi racchiudere qualsiasi comando nella invisible()
funzione e sopprimerà l'output. Per esempio:
1:10 # prints output
invisible(1:10) # hides it
Altrimenti, puoi sempre combinare le cose in una riga con punto e virgola e parentesi:
{ sink("/dev/null"); ....; sink(); }
invisible()
sopprime solo la stampa di un'espressione, non è una sink()
riga.
apply
, come per la domanda: invisible(apply(matrix(1:10), 1, as.numeric))
.
{ sink("/dev/null"); ....; sink(); }
preferirei sicuramente capture.output
, come capture.output
effettivamente fa esattamente sopra, solo molto meglio (dai un'occhiata alla fonte, chiama sink come nella moda sopra, oltre ad alcune cose carine attorno ad esso).
idw
funzione sotto Windows. Penso che la soluzione migliore sia usaresink
Usa la capture.output()
funzione. Funziona in modo molto simile a un unico sink()
e invisible()
, a differenza , può sopprimere più della semplice stampa di messaggi. Imposta l'argomento del file /dev/null
su UNIX o NUL
su Windows. Ad esempio, considerando la nota di Dirk:
> invisible(cat("Hi\n"))
Hi
> capture.output( cat("Hi\n"), file='NUL')
>
capture.output(x <- log(2))
e successivamente x
ha il valore di log(2)
...
R stampa automaticamente solo l'output delle espressioni non assegnate, quindi assegna semplicemente il risultato di apply
a una variabile e non verrà stampato.
print()
o cat()
in esse che va allo schermo, non a un compito.
La seguente funzione dovrebbe fare esattamente quello che vuoi:
hush=function(code){
sink("NUL") # use /dev/null in UNIX
tmp = code
sink()
return(tmp)
}
Ad esempio con la funzione qui:
foo=function(){
print("BAR!")
return(42)
}
in esecuzione
x = hush(foo())
Assegnerà 42 ax ma non stamperà "BAR!" a STDOUT
Nota che in un sistema operativo UNIX dovrai sostituire "NUL" con "/ dev / null"
Nel caso in cui qualcuno arrivi qui alla ricerca di una soluzione applicabile a RMarkdown, questo sopprimerà tutto l'output:
```{r error=FALSE, warning=FALSE, message=FALSE}
invisible({capture.output({
# Your code goes here
2 * 2
# etc
# etc
})})
```
Il codice verrà eseguito, ma l'output non verrà stampato nel documento HTML
Rendere il commento di Hadley a una risposta (spero di renderlo più visibile). L'uso della famiglia di applicazioni senza stampa è possibile con l'uso della plyr
confezione
x <- 1:2
lapply(x, function(x) x + 1)
#> [[1]]
#> [1] 2
#>
#> [[2]]
#> [1] 3
plyr::l_ply(x, function(x) x + 1)
Creato il 19/05/2020 dal pacchetto reprex (v0.3.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))
produce un output senza NULL alla fine della riga o sulla riga successiva
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