Sopprime l'output di una funzione


90

Sto cercando di sopprimere l'output di un comando (in questo caso, la applyfunzione).

È possibile farlo senza utilizzare sink()? Ho trovato la soluzione descritta di seguito, ma vorrei farlo in una riga se possibile.

Come sopprimere l'output


2
Puoi spiegare cosa intendi con "fai questo in linea"? Altrimenti la domanda che citi fornisce già la risposta e questo è un duplicato.
Dirk Eddelbuettel

1
Questa soluzione richiede tre righe, una che reindirizza l'output, il comando e poi un'altra per riattivare l'output.
Tor

8
Oppure usa capture.output. Oppure usa *_plydal pacchetto plyr.
Hadley

1
Secondo il suggerimento di Hadley: se stai davvero cercando di eseguire una funzione di applicazione, come lapply, senza stampare l'output, 'l_ply` dal suo plyrpacchetto è probabilmente la scelta più appropriata.
Sharpie

Risposte:


92

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

5
Prova "invisibile (gatto (" Ciao \ n "))": invisible()sopprime solo la stampa di un'espressione, non è una sink()riga.
Dirk Eddelbuettel

2
Giusto, ma penso che soddisfi le esigenze dell'interrogante, a meno che non manchi qualcosa nella domanda ...
Shane

1
Per esempio, questo sopprime il ritorno di apply, come per la domanda: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane,

Piuttosto che { sink("/dev/null"); ....; sink(); }preferirei sicuramente capture.output, come capture.outputeffettivamente 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).
Cookie

3
non funziona sulla idwfunzione sotto Windows. Penso che la soluzione migliore sia usaresink
TMS

58

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/nullsu UNIX o NULsu Windows. Ad esempio, considerando la nota di Dirk:

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

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

10
non funziona se si desidera applicarlo a una funzione che restituisce un valore e si desidera utilizzare questo valore
TMS

8
@TMS È cambiato qualcosa negli ultimi mesi? Ho appena testato per utilizzare il valore restituito da una funzione e ha funzionato ... capture.output(x <- log(2))e successivamente xha il valore di log(2)...
drmariod

10

puoi usare "capture.output" come sotto. Ciò consente di utilizzare i dati in un secondo momento:

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

test$betas

9

R stampa automaticamente solo l'output delle espressioni non assegnate, quindi assegna semplicemente il risultato di applya una variabile e non verrà stampato.


4
Alcune funzioni hanno un print()o cat()in esse che va allo schermo, non a un compito.
keithpjolley

9

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"


Questa è stata l'unica risposta che ha fatto ciò di cui avevo bisogno, sottovalutata.
tomka

esattamente quello di cui avevo bisogno anche io
gaspar

3

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


1

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 plyrconfezione

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)


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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.