2011-03-15 16 views
12

Supongamos que tengo la siguiente función:La desactivación del comando cat

## Just an example 
f = function() { 
    for(i in 1:10000) 
     cat(i) 
    return(1) 
} 

Cuando llamo f() hay una manera de detener la impresión cat a la pantalla (sin alterar la función de todos modos)?

La razón detrás de esta pregunta

Mis estudiantes subir sus archivos R. Luego ejecuto las secuencias de comandos y verifico si son correctas. De vez en cuando, un estudiante se va en el comando cat. Esto es especialmente irritante cuando está en un ciclo largo

+0

No es eso lo hace 'cat'? ¿Por qué querrías usar 'cat' y suprimir su funcionalidad? –

+0

@Tomalak: Buen comentario. He actualizado mi pregunta. – csgillespie

+0

@csgilliespie: marca al estudiante y sigue adelante. Las personas deben estar capacitadas para no dejar líneas de depuración en el código de producción. –

Respuesta

17

En Linux, se puede utilizar una llamada sink() a /dev/null (o en un archivo temporal en otro sistema operativo, consulte ?tempfile) :

sink(file="/dev/null") 
f() 
sink() 
+2

'sink' es muy útil. Sin embargo, también hundirá el valor de retorno de la función. –

+1

@Sacha, la solución obvia es asignar la salida de 'f()' a un objeto. –

+0

Derecha, por supuesto :) –

4

Esto debería funcionar?

oldcat = cat 
cat = function(..., file="", sep=" ", fill=F, labels=NULL, append=F) {} 
f() 
cat = oldcat 

Basta con sustituir cat con un vacío function, y luego ponerlo de nuevo en la terminación

+2

'cat <- function (...) {}' sería más simple – hadley

+0

o incluso 'cat <- list' siempre que' cat' solo aparezca en las funciones. –

+0

'cat <- list' parece un poco obtuso. Estoy seguro de que tendría que leer eso 3 o 4 veces para recordar lo que estaba haciendo ... –

1

Aquí es un truco divertido que comenta a cabo todas las cat() 's en una función. No estoy seguro si esto da errores o rompe la función sin embargo:

foo <- deparse(f) 
f <- eval(parse(text=gsub("cat","#cat",foo))) 

f() 

[1] 1 

Editar:

Otra opción es básicamente la respuesta de Juba, usando el fregadero, pero se puede utilizar el paquete Defaults para cambiar el comportamiento predeterminado de cat. El argumento file básicamente hunde su salida en un archivo. Por lo tanto:

library("Defaults") 
setDefaults(cat,file="sink.txt") 

f() 

asegura que sólo la salida de cat y no print o así se sinked. Sin embargo, esto reduce drásticamente el tiempo de ejecución ya que ahora se abre y se cierra un archivo cada vez que se ejecuta cat().

+4

¡Yikes! ¡Esa primera idea matará el código de sus estudiantes si han usado las letras 'gato' en cualquier lugar! Como una variable llamada 'catálogo' ... – Spacedman

+2

Deberías usar expresiones regulares para esa: 'gsub ("^cat $ "," #cat ", foo)' – aL3xa

1

capture.output() con invisible() hace lo que quiere:

f <- function() { 
    cat("Hello") 
    return(TRUE) 
} 
f1 <- function() { 
    invisible(capture.output(f())) 
} 
x <- f1() 

Esto también funciona:

f2 <- function() { 
    tmp <- tempfile() 
    sink(tmp) 
    on.exit(sink()) 
    on.exit(file.remove(tmp), add = TRUE) 
    invisible(force(f())) 
} 
x <- f2() 
Cuestiones relacionadas