【问题标题】:Disabling the cat command禁用 cat 命令
【发布时间】:2011-07-15 16:30:12
【问题描述】:

假设我有以下功能:

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

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

这个问题背后的原因

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

【问题讨论】:

    标签: r cat


    【解决方案1】:

    在 Linux 上,您可以使用sink() 调用/dev/null(或调用另一个操作系统上的临时文件,请参阅?tempfile):

    sink(file="/dev/null")
    f()
    sink()
    

    【讨论】:

    • sink 非常有用。但是它也会接收函数的返回值。
    • @Sacha 明显的解决方案是将f() 的输出分配给一个对象。
    • 或者一行capture.output(x <- f())
    【解决方案2】:

    这应该可以吗?

    oldcat = cat
    cat = function( ..., file="", sep=" ", fill=F, labels=NULL, append=F ) {}
    f()
    cat = oldcat
    

    只需将cat 替换为空的function,然后在完成时将其重新设置

    【讨论】:

    • cat <- function(...) {} 会更简单
    • 甚至cat <- list,只要cat只出现在函数中。
    • cat <- list 似乎有点迟钝。我确信我必须阅读 3 或 4 遍才能记住我在做什么......
    • rm(cat) 还将恢复 cat 删除全局环境中的版本,这样它就不会掩盖基础中的版本。我们也可以消除对oldcat 的需求,因为它始终可以被引用为base::cat
    【解决方案3】:

    这是一个有趣的 hack,它可以在一个函数中找出所有 cat()。不确定这是否会产生错误或破坏功能:

    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() 时都会打开和关闭一个文件。

    【讨论】:

    • 哎呀!如果他们在任何地方使用了字母“猫”,第一个想法就会杀死你的学生的代码!比如一个叫做'catalog'的变量...
    • 你应该使用正则表达式:gsub("^cat$", "#cat", foo)
    • 旧答案。但请注意,这也会中断多行 cat 调用。
    【解决方案4】:

    capture.output()invisible() 做你想做的事:

    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()
    

    【讨论】:

      【解决方案5】:

      purrr 库中的函数 quietly() 创建了一个安静版本的函数:

      library(purrr)
      f <- function() {
          cat("Hello")
          return(TRUE)
      }
      f2 <- quietly(f)
      f2()
      #> $result
      #> [1] TRUE
      #> 
      #> $output
      #> [1] "Hello"
      #> 
      #> $warnings
      #> character(0)
      #> 
      #> $messages
      #> character(0)
      

      【讨论】:

        猜你喜欢
        • 2012-03-20
        • 2019-09-14
        • 1970-01-01
        • 2021-07-15
        • 1970-01-01
        • 2023-03-30
        • 2016-09-03
        • 2013-07-27
        相关资源
        最近更新 更多