Suppose I have the following function:
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
When I call
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
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()
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()
The function quietly()
from the purrr
library creates a quiet version of a function:
library(purrr)
f <- function() {
cat("Hello")
return(TRUE)
}
f2 <- quietly(f)
f2()
#> $result
#> [1] TRUE
#>
#> $output
#> [1] "Hello"
#>
#> $warnings
#> character(0)
#>
#> $messages
#> character(0)