Suppose I have the following function:
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
When I call f()
is there a way to stop cat
printing to the screen (without altering the function in anyway)?
Reason behind this question
My students upload their R files. I then run the scripts and check to see if they are correct. Every so often, a student leaves in the cat
command. This is especially irritating when it's in a long for loop
On Linux, you can use a sink()
call to /dev/null
(or to a temporary file on another OS, see ?tempfile
) :
sink(file="/dev/null")
f()
sink()
This should work?
oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat
Just replace cat
with an empty function
, and then set it back on completion
Here is a funny hack that comments out all the cat()
's in a function. Not sure if this gives errors or breaks the function though:
foo <- deparse(f)
f <- eval(parse(text=gsub("cat","#cat",foo)))
f()
[1] 1
Edit:
Another option is basically Juba's answer, using sink, but you can use the Defaults
package to change the default behavior of cat
. The file
argument basically sinks its output in a file. So :
library("Defaults")
setDefaults(cat,file="sink.txt")
f()
Ensures that only output of cat
and not print
or so is sinked. However, this drastically reduces the runtime since now a file is opened and closed everytime cat()
is run.
capture.output()
with invisible()
does what you want:
f <- function() {
cat("Hello")
return(TRUE)
}
f1 <- function() {
invisible(capture.output(f()))
}
x <- f1()
This also works:
f2 <- function() {
tmp <- tempfile()
sink(tmp)
on.exit(sink())
on.exit(file.remove(tmp), add = TRUE)
invisible(force(f()))
}
x <- f2()