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()
with
invisible()
可以满足您的需要:

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或甚至
cat
cat
rm(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)