禁用cat命令

发布于 2024-10-23 11:56:13 字数 335 浏览 5 评论 0原文

假设我有以下函数:

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

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

此问题背后的原因

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

Suppose I have the following function:

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

When I call f() is there a way to stop cat printing to the screen (without altering the function in anyway)?

Reason behind this question

My students upload their R files. I then run the scripts and check to see if they are correct. Every so often, a student leaves in the cat command. This is especially irritating when it's in a long for loop

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(5

我为君王 2024-10-30 11:56:13

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

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

On Linux, you can use a sink() call to /dev/null(or to a temporary file on another OS, see ?tempfile) :

sink(file="/dev/null")
f()
sink()
吃素的狼 2024-10-30 11:56:13

这应该有效吗?

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

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

This should work?

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

Just replace cat with an empty function, and then set it back on completion

晨曦÷微暖 2024-10-30 11:56:13

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

capture.output() with invisible() does what you want:

f <- function() {
    cat("Hello")
    return(TRUE)
}
f1 <- function() {
    invisible(capture.output(f()))
}
x <- f1()

This also works:

f2 <- function() {
    tmp <- tempfile()
    sink(tmp)
    on.exit(sink())
    on.exit(file.remove(tmp), add = TRUE)
    invisible(force(f())) 
}
x <- f2()
心的位置 2024-10-30 11:56:13

这是一个有趣的技巧,它注释掉函数中的所有 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() 时都会打开和关闭一个文件。

Here is a funny hack that comments out all the cat()'s in a function. Not sure if this gives errors or breaks the function though:

foo <- deparse(f)
f <- eval(parse(text=gsub("cat","#cat",foo)))

f()

[1] 1

Edit:

Another option is basically Juba's answer, using sink, but you can use the Defaults package to change the default behavior of cat. The file argument basically sinks its output in a file. So :

library("Defaults")
setDefaults(cat,file="sink.txt")

f()

Ensures that only output of cat and not print or so is sinked. However, this drastically reduces the runtime since now a file is opened and closed everytime cat() is run.

安静 2024-10-30 11:56:13

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)

The function quietly() from the purrr library creates a quiet version of a function:

library(purrr)
f <- function() {
    cat("Hello")
    return(TRUE)
}
f2 <- quietly(f)
f2()
#> $result
#> [1] TRUE
#> 
#> $output
#> [1] "Hello"
#> 
#> $warnings
#> character(0)
#> 
#> $messages
#> character(0)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文