假设我有以下功能:
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
当我致电f()
时,是否有办法阻止cat
打印到屏幕上(无论如何都不改变功能)?
此问题背后的原因
我的学生上传他们的R档案。然后我运行脚本并检查它们是否正确。每隔一段时间,学生就会离开cat
命令。当这是一个漫长的循环时,这尤其令人恼火
答案 0 :(得分:19)
在Linux上,您可以sink()
使用/dev/null
(或另一个操作系统上的临时文件,请参阅?tempfile
):
sink(file="/dev/null")
f()
sink()
答案 1 :(得分:5)
这应该有用吗?
oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat
只需将cat
替换为空function
,然后在完成后重新设置
答案 2 :(得分:2)
这是一个有趣的黑客,它会在功能中注释掉所有cat()
。不确定这是否会导致错误或破坏功能:
foo <- deparse(f)
f <- eval(parse(text=gsub("cat","#cat",foo)))
f()
[1] 1
另一个选项基本上是Juba的回答,使用接收器,但您可以使用Defaults
包来更改cat
的默认行为。 file
参数基本上将其输出汇入文件中。所以:
library("Defaults")
setDefaults(cat,file="sink.txt")
f()
确保仅输出cat
而不是print
左右的输出。但是,这会大大减少运行时间,因为现在每次运行cat()
时都会打开和关闭文件。
答案 3 :(得分:2)
{
"kind": "calendar#freeBusy",
"timeMin": "2015-12-23T14:00:00.000Z",
"timeMax": "2015-12-30T14:00:00.000Z",
"calendars": {
"<YOUR-ID>": {
"busy": [
{
"start": "2015-12-28T18:00:00Z",
"end": "2015-12-28T18:25:00Z"
},
{
"start": "2015-12-30T09:00:00Z",
"end": "2015-12-30T10:00:00Z"
}
]
}
}
}
的{p> capture.output()
符合您的要求:
invisible()
这也有效:
f <- function() {
cat("Hello")
return(TRUE)
}
f1 <- function() {
invisible(capture.output(f()))
}
x <- f1()
答案 4 :(得分: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)