在批处理模式下使用 R 抑制“空设备”输出

Posted

技术标签:

【中文标题】在批处理模式下使用 R 抑制“空设备”输出【英文标题】:Suppressing "null device" output with R in batch mode 【发布时间】:2010-10-19 12:56:33 【问题描述】:

我有许多 bash 脚本,它们调用 R 脚本进行绘图。类似的东西:

#!/bin/bash
R --vanilla --slave <<RSCRIPT
cat("Plotting $1 to $2\n")
input <- read.table("$1")
png("$2")
plot(as.numeric(input[1,]))
dev.off()
RSCRIPT

问题是尽管--slave,对dev.off() 的调用会打印消息null device 1。一旦完成了很多绘图,或者对于绘图到多个文件的更复杂的脚本,这将是一个真正的麻烦。

有什么方法可以屏蔽这条消息吗?

【问题讨论】:

试试:invisible(dev.off()) 垃圾 【参考方案1】:

据我所知,dev.off() 与设备相关的函数(如png())不同,它返回一个值:“新活动设备的编号和名称”。该值是在标准输出中回显的值。

因此可以通过将其放在某个地方来实现抑制它,即,

garbage <- dev.off()

【讨论】:

简单问题的简单解决方案,不像在 R 中搞乱实现细节。因此 +1 来自我。 我认为这是最好的答案。选择的最佳答案对我不起作用。 R 抱怨没有称为 dev.off() 的内部函数 返回值也可以用invisible(dev.off())抑制【参考方案2】:

R 的优点之一是您可以查看许多函数的源代码:

> dev.off
function (which = dev.cur()) 

    if (which == 1) 
        stop("cannot shut down device 1 (the null device)")
    .Internal(dev.off(as.integer(which)))
    dev.cur()

<environment: namespace:grDevices>

所以它调用.Internal(dev.off(...)),然后返回dev.cur(),我想如果你有几个设备打开这样你知道哪一个激活了,这会很有用。您可以在脚本中使用.Internal(dev.off(as.integer(dev.cur()))),或者甚至修补dev.off,仅在dev.cur() 的值不是空设备时返回它,然后将修补程序发送给R 的维护者。

另外,graphics.off() 为所有设备调用 dev.off() 并且不返回任何内容。

【讨论】:

【参考方案3】:

最近遇到了同样的问题,发现这里的答案中没有提到另一种可能性:

invisible(dev.off())

这将隐藏dev.off() 的输出,并且不会创建其他变量,这与将输出分配给garbage 变量:garbage &lt;- def.off() 不同。

【讨论】:

【参考方案4】:

另一种选择是使用 sink() 并将所有内容输出到日志文件中,以便您可以根据需要检查绘图是否有效。

【讨论】:

【参考方案5】:

您可以改用littler,这是a) 编写R“脚本”的一种更简单的方法,b) 抑制输出,因此您会得到 dev.off 静音的副作用:

$ foo.r /tmp/foo.txt /tmp/foo.png
Plotting /tmp/foo.txt to /tmp/foo.png
$ cat /tmp/foo.r
#!/usr/bin/r
cat("Plotting", argv[1], "to", argv[2], "\n")
input <- read.table(argv[1])
png(argv[2])
plot(as.numeric(input[1,]))
dev.off()
$

Rscript 也可能会起作用;我倾向于更小的。

【讨论】:

很高兴知道这一点。但它需要对 Rscript 源进行更多修改。例如,仅给出变量名称的正常变量打印默认情况下也是无声的。

以上是关于在批处理模式下使用 R 抑制“空设备”输出的主要内容,如果未能解决你的问题,请参考以下文章

如何抑制 Qt GUI 应用程序?

shell脚本学习笔记

/dev/null简介

在 R pdf 输出中抑制或设置 CreationDate/ModDate

liunx下jar包发布

如何在 R studio 的 Caret 中抑制 Boosted 树模型 gbm 的迭代输出