2010-09-10 16 views
8

En R algunas funciones pueden imprimir información y valores devueltos, ¿puede silenciarse la impresión?¿Se puede silenciar el comando print() en R?

Por ejemplo:

print.and.return <- function() { 
    print("foo") 
    return("bar") 
} 

vuelve

> print.and.return() 
[1] "foo" 
[1] "bar" 
> 

puedo almacenar el retorno como:

> z <- print.and.return() 
[1] "foo" 
> z 
[1] "bar" 
> 

¿Puedo suprimir la impresión de "foo"?

+4

pregunta como ésta sugiere que está haciendo algo de una manera muy sucia ... – mbq

+0

el p El problema es que no es mi función que imprima y regrese, salvo bucear en la biblioteca importada. Quiero silenciar la salida. – ayman

Respuesta

7

Usted puede usar la naturaleza funcional oculta de R, por ejemplo, mediante la función

deprintize<-function(f){ 
return(function(...) {capture.output(w<-f(...));return(w);}); 
} 
definir

que convertirá funciones 'impresión' a los 'silenciosos':

noisyf<-function(x){ 
print("BOO!"); 
sin(x); 
} 

noisyf(7) 
deprintize(noisyf)(7) 
deprintize(noisyf)->silentf;silentf(7) 
+0

'quiet' podría ser un nombre mejor para esa función ... – hadley

+3

@hadley aburrido! – mbq

9
?capture.output 
+0

Bueno, en mi ejemplo: dev.nil <- capture.output (z <- print.and.return()) hace el truco. – ayman

3

Si necesita absolutamente el efecto secundario de imprimir en sus propias funciones, ¿por qué no hacerlo una opción?

print.and.return <- function(..., verbose=TRUE) { 
    if (verbose) 
    print("foo") 
    return("bar") 
} 


> print.and.return() 
[1] "foo" 
[1] "bar" 
> print.and.return(verbose=FALSE) 
[1] "bar" 
> 
+0

Buen uso de un valor predeterminado; el problema es que no es mi función. – ayman

+0

En muchos casos donde haría esto, probablemente debería usar 'mensaje' en lugar de imprimir. (Es decir, en los casos en que su '" foo "' es una cadena, en lugar de un objeto R para el que desea utilizar el método de impresión.) – Gregor

3

Estoy de acuerdo con la sugerencia de hadley y mbq de capture.output como la solución más general. Para el caso especial de las funciones que escribe (es decir, las que controlan el contenido), use message en lugar de print. De esta forma puede suprimir la salida con suppressMessages.

print.and.return2 <- function() { 
    message("foo") 
    return("bar") 
} 

# Compare: 
print.and.return2() 
suppressMessages(print.and.return2()) 
1

Sé que podría estar resucitando esta publicación pero alguien más podría encontrarla como yo. Yo estaba interesado en el mismo comportamiento en una de mis funciones y me encontré con la "invisibilidad":

Tiene el mismo uso de return() pero simplemente no se imprimen el valor devuelto:

invisible(variable) 

por lo tanto, para el ejemplo dado por @ayman:

print.and.return2 <- function() { 
    message("foo") 
    invisible("bar") 
} 

Saludos

Cuestiones relacionadas