在批处理模式下使用 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 <- 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 抑制“空设备”输出的主要内容,如果未能解决你的问题,请参考以下文章