Disabling the cat command

2019-01-24 04:00发布

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

标签: r cat
4条回答
姐就是有狂的资本
2楼-- · 2019-01-24 04:36

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

查看更多
家丑人穷心不美
3楼-- · 2019-01-24 04:41

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()
查看更多
淡お忘
4楼-- · 2019-01-24 04:42

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()
查看更多
Deceive 欺骗
5楼-- · 2019-01-24 04:51

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.

查看更多
登录 后发表回答