禁用cat命令

时间:2011-03-15 10:30:27

标签: r cat

假设我有以下功能:

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

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

此问题背后的原因

我的学生上传他们的R档案。然后我运行脚本并检查它们是否正确。每隔一段时间,学生就会离开cat命令。当这是一个漫长的循环时,这尤其令人恼火

5 个答案:

答案 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)