R 禁用cat命令
假设我有以下函数:R 禁用cat命令,r,cat,R,Cat,假设我有以下函数: ## Just an example f = function() { for(i in 1:10000) cat(i) return(1) } library(purrr) f <- function() { cat("Hello") return(TRUE) } f2 <- quietly(f) f2() #> $result #> [1] TRUE #> #> $output #> [1
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
library(purrr)
f <- function() {
cat("Hello")
return(TRUE)
}
f2 <- quietly(f)
f2()
#> $result
#> [1] TRUE
#>
#> $output
#> [1] "Hello"
#>
#> $warnings
#> character(0)
#>
#> $messages
#> character(0)
当我调用f()
时,是否有方法停止cat
在屏幕上打印(无论如何都不改变功能)
这个问题背后的原因
我的学生上传他们的R文件。然后我运行脚本并检查它们是否正确。每隔一段时间,学生就会在cat
命令中离开。当它处于长for循环时,这尤其令人恼火,这应该有效吗
oldcat = cat
cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
f()
cat = oldcat
只需将
cat
替换为空的函数
,然后将其设置回完成状态在Linux上,您可以使用sink()
调用/dev/null
(或另一个操作系统上的临时文件,请参见?tempfile
):
下面是一个有趣的hack,它注释掉了函数中所有的
cat()
。不确定这是否会导致错误或中断功能,但:
foo <- deparse(f)
f <- eval(parse(text=gsub("cat","#cat",foo)))
f()
[1] 1
确保只有cat
的输出,而不是print
或so的输出是下沉的。但是,这大大减少了运行时间,因为现在每次运行cat()
时都会打开和关闭文件。capture.output()
withinvisible()
可以满足您的需要:
f <- function() {
cat("Hello")
return(TRUE)
}
f1 <- function() {
invisible(capture.output(f()))
}
x <- f1()
f来自purr
库的函数quietly()
创建函数的静默版本:
## Just an example
f = function() {
for(i in 1:10000)
cat(i)
return(1)
}
library(purrr)
f <- function() {
cat("Hello")
return(TRUE)
}
f2 <- quietly(f)
f2()
#> $result
#> [1] TRUE
#>
#> $output
#> [1] "Hello"
#>
#> $warnings
#> character(0)
#>
#> $messages
#> character(0)
库(purrr)
f[1]正确
#>
#>$output
#>[1]“你好”
#>
#>$warnings
#>字符(0)
#>
#>$messages
#>字符(0)
接收器
非常有用。但是,它也将接收函数的返回值。@Sacha一个明显的解决方案是将f()
的输出分配给一个对象。或者在一行capture.output中(x Yikes!如果你的学生在任何地方都使用了字母“cat”,那么第一个想法将杀死他们的代码!例如一个名为“catalog”的变量……你应该使用正则表达式来表示该变量:gsub(“^cat$”,“#cat”,foo)
旧答案。但请注意,这也会打断多行cat
调用。cat或甚至catcatrm(cat)
还将还原cat
在全局环境中删除该版本,这样它就不会在base中屏蔽该版本。此外,我们还可以消除对oldcat
的需要,因为它始终可以被引用为base::cat
。
library(purrr)
f <- function() {
cat("Hello")
return(TRUE)
}
f2 <- quietly(f)
f2()
#> $result
#> [1] TRUE
#>
#> $output
#> [1] "Hello"
#>
#> $warnings
#> character(0)
#>
#> $messages
#> character(0)