假设我有以下功能:
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
当我打电话时f()
,有没有办法停止cat
打印到屏幕上(无论如何都不改变功能)?
这个问题背后的原因
我的学生上传他们的 R 文件。然后我运行脚本并检查它们是否正确。每隔一段时间,就有一名学生离开cat
指挥部。当它处于长 for 循环中时,这尤其令人恼火
在 Linux 上,您可以sink()
调用/dev/null
(或调用另一个操作系统上的临时文件,请参阅?tempfile
):
sink(file="/dev/null")
f()
sink()
这应该有效吗?
oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat
只需替换cat
为空function
,然后在完成时将其重新设置
这是一个有趣的 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()
运行文件都会打开和关闭。
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()
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)