2012-01-10 10 views
15

Muchos paquetes R con los que trabajo implican funciones que dan todos sus mensajes y advertencias a través de comandos para imprimir() llamadas en lugar de comandos a mensaje() o advertencia(). Me gustaría poder silenciar estos indicadores de progreso de funciones, etc., pero el estándar supressWarnings() o supressMessages no lo hace. ¿Hay alguna manera de suprimir Imprimir?suprimir mensajes visualizados por "imprimir" en lugar de "mensaje" o "advertencia" en R

Por ejemplo:

silly_developer_function <- function(x){ 
    print("Thanks for using my function!!") 
    if(is(x, "numeric")) 
    print("warning, x should be a character") 
    x 
} 

Me gustaría tener un simple suppressPrint() la función que podría envolver alrededor de una llamada a esta función que suprimir los mensajes de aviso e inútiles (pero todavía imprimir la declaración valor).

+0

Existe la estragada estrategia de utilizar 'sink', pero puede haber una manera mejor. – joran

+0

@cboettig: su edición propuesta de la solución de Simon es agradable, pero sería mejor incluirla como una edición/adición a su propia publicación. Gracias. –

+0

@ JoshO'Brien Gracias por el puntero. ¿Edito mi pregunta original con esa propuesta? Parece extraño convertir la pregunta en una respuesta? – cboettig

Respuesta

25

Bueno, esos paquetes son defectuosos para empezar. El uso de print() para cualquier cosa que no sea un efecto secundario en las implementaciones print es un grave error.

Dicho esto, simplemente puede usar capture.output() para recopilar la salida de dicho código en lugar de imprimirlo. Así que para lo anterior sería

capture.output(x <- silly_developer_function(...)) 
print(x) 
+0

Gran solución. Podría asignar el resultado de capture.output para evitar que se imprima. Acordé que este es un trabajo en torno al código de error, pero el uso de print en lugar de message() es endémico en los paquetes que uso, ¡así que su solución es bastante útil! – cboettig

+1

FWIW si le preocupa la salida en la consola (que agrega 'print (..)' automáticamente) puede envolver el 'capture.output' en' invisible (...) ' –

+0

Gracias, eso es útil. Me encuentro con este problema al escribir viñetas de Sweave que recorren algunas de esas funciones, y Sweave/Knitr también agrega la impresión automáticamente. Idealmente, esto podría reprimirse en las opciones de Sweave de la misma manera que los mensajes y las advertencias. – cboettig

0

Otra manera hacky es reemplazar el valor predeterminado print función. Afectará algunas funciones, como la impresión del cuerpo de funciones, pero los objetos con sus propios métodos de impresión aún se devuelven como de costumbre.

print <- function(...) {} 

> silly_developer_function("a") 
[1] "a" 
> silly_developer_function(1) 
[1] 1 
+0

Eso no funcionará en general, porque los paquetes no necesariamente usan el espacio de nombres global para la búsqueda de funciones. –

+0

@SimonUrbanek Ah, sí, eso es verdad – James

Cuestiones relacionadas