15

假设我有以下功能:

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

当我打电话时f(),有没有办法停止cat打印到屏幕上(无论如何都不改变功能)?

这个问题背后的原因

我的学生上传他们的 R 文件。然后我运行脚本并检查它们是否正确。每隔一段时间,就有一名学生离开cat指挥部。当它处于长 for 循环中时,这尤其令人恼火

4

5 回答 5

20

在 Linux 上,您可以sink()调用/dev/null(或调用另一个操作系统上的临时文件,请参阅?tempfile):

sink(file="/dev/null")
f()
sink()
于 2011-03-15T10:41:31.450 回答
5

这应该有效吗?

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

只需替换cat为空function,然后在完成时将其重新设置

于 2011-03-15T10:41:16.160 回答
2

这是一个有趣的 hack,它注释掉cat()函数中的所有 's。不确定这是否会产生错误或破坏功能:

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

f()

[1] 1

编辑:

另一个选项基本上是 Juba 的答案,使用 sink,但是您可以使用Defaults包来更改cat. 该file参数基本上将其输出接收到一个文件中。所以 :

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

f()

确保只有输出cat而不是print左右下沉。但是,这大大减少了运行时间,因为现在每次cat()运行文件都会打开和关闭。

于 2011-03-15T11:18:23.380 回答
2

capture.output()withinvisible()做你想做的事:

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

这也有效:

f2 <- function() {
    tmp <- tempfile()
    sink(tmp)
    on.exit(sink())
    on.exit(file.remove(tmp), add = TRUE)
    invisible(force(f())) 
}
x <- f2()
于 2015-12-29T12:16:31.547 回答
1

quietly()库中的函数purrr创建了一个安静版本的函数:

library(purrr)
f <- function() {
    cat("Hello")
    return(TRUE)
}
f2 <- quietly(f)
f2()
#> $result
#> [1] TRUE
#> 
#> $output
#> [1] "Hello"
#> 
#> $warnings
#> character(0)
#> 
#> $messages
#> character(0)
于 2019-09-11T22:31:46.143 回答