Suprime la salida de una función

90

Estoy buscando suprimir la salida de un comando (en este caso, la applyfunción).

¿Es posible hacer esto sin usar sink()? Encontré la solución descrita a continuación, pero me gustaría hacer esto en una línea si es posible.

Cómo suprimir la salida

Colina
fuente
2
¿Puede explicar lo que quiere decir con "hacer esto en línea"? De lo contrario, la pregunta que cita ya proporciona la respuesta y esta es un duplicado.
Dirk Eddelbuettel
1
Esta solución requiere tres líneas, una que redirecciona la salida, el comando y luego otra para volver a activar la salida.
Tor
8
O usar capture.output. O utilícelo *_plydel paquete plyr.
hadley
1
En segundo lugar, la sugerencia de Hadley: si realmente está intentando ejecutar una función de aplicación, por ejemplo lapply, sin imprimir la salida, 'l_ply` de su plyrpaquete es probablemente la opción más adecuada.
Sharpie

Respuestas:

92

No está claro por qué quiere hacer esto sin sink, pero puede ajustar cualquier comando en la invisible()función y suprimirá la salida. Por ejemplo:

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

De lo contrario, siempre puede combinar las cosas en una línea con un punto y coma y paréntesis:

{ sink("/dev/null"); ....; sink(); }
Shane
fuente
5
Pruebe 'invisible (cat ("Hi \ n"))' - invisible()solo suprime la impresión de una expresión, no es una sink()línea.
Dirk Eddelbuettel
2
Correcto, pero creo que satisface las necesidades del interrogador, a menos que me falte algo en la pregunta ...
Shane
1
Por ejemplo, esto suprime la devolución de apply, según la pregunta: invisible(apply(matrix(1:10), 1, as.numeric)).
Shane
En lugar de { sink("/dev/null"); ....; sink(); }definitivamente preferiría capture.output, como lo capture.outputhace exactamente arriba, simplemente mucho mejor (eche un vistazo a la fuente, llama al sumidero como en la moda anterior, además de algunas cosas agradables a su alrededor).
Cookie
3
no funciona en idwfunción de Windows. Creo que la mejor solución es usarsink
TMS
58

Usa la capture.output()función. Funciona de forma muy parecida a una única sink()y invisible(), a diferencia de ello, puede suprimir algo más que imprimir mensajes. Establezca el argumento del archivo en /dev/nullen UNIX o NULen Windows. Por ejemplo, considerando la nota de Dirk:

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

> capture.output( cat("Hi\n"), file='NUL')
> 
Sharpie
fuente
10
no funciona si desea aplicar esto a una función que devuelve algún valor y desea usar este valor
TMS
8
@TMS ¿Ha cambiado algo durante los últimos meses? Acabo de probar para usar el valor devuelto por una función y funcionó ... capture.output(x <- log(2))y luego xtiene el valor de log(2)...
drmariod
10

puede usar 'capture.output' como se muestra a continuación. Esto le permite utilizar los datos más tarde:

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

test$betas
Kristy
fuente
9

R solo imprime automáticamente la salida de expresiones no asignadas, así que simplemente asigne el resultado applya una variable y no se imprimirá.

Aniko
fuente
4
Algunas funciones tienen una print()o cat()en ellas que va a la pantalla, no a una asignación.
keithpjolley
9

La siguiente función debería hacer exactamente lo que quieres:

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

Por ejemplo, con la función aquí:

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

corriendo

x = hush(foo())

Asignará 42 ax pero no imprimirá "BAR!" a STDOUT

Tenga en cuenta que en un sistema operativo UNIX deberá reemplazar "NUL" con "/ dev / null"

Danny
fuente
Esta fue la única respuesta que hizo lo que necesitaba, subestimada.
tomka
exactamente lo que necesitaba también
gaspar
3

En caso de que alguien llegue aquí buscando una solución aplicable a RMarkdown, esto suprimirá todos los resultados:

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

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


})})
```

El código se ejecutará, pero la salida no se imprimirá en el documento HTML.

stevec
fuente
1

Hacer que el comentario de Hadley sea una respuesta (espero que sea más visible). El uso de la familia de aplicaciones sin imprimir es posible con el uso del plyrpaquete

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

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

Creado el 2020-05-19 por el paquete reprex (v0.3.0)

Tjebo
fuente
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 salida sin NULL al final de la línea o en la siguiente línea

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
fuente