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

bla*_*lah 33 bash statistics charts r

我有许多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
Run Code Online (Sandbox Code Playgroud)

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

有没有办法压制这个消息?

bla*_*lah 42

无论如何我都知道dev.off(),与设备相关的功能不同,例如png()返回一个值:"新活动设备的数量和名称".这个值正在向stdout回应.

因此可以通过将其放在某处来实现抑制,即,

garbage <- dev.off()
Run Code Online (Sandbox Code Playgroud)

  • 一个简单问题的简单解决方案,不像在R中搞乱实现细节.因此我来自+1. (7认同)
  • 使用`invisible(dev.off())`也可以抑制返回的值 (3认同)

Jou*_*nen 20

关于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>
Run Code Online (Sandbox Code Playgroud)

所以它调用.Internal(dev.off(...))然后返回dev.cur(),如果你有几个设备打开,我想这将是有用的,所以你知道哪个设备变为活动状态.你可以.Internal(dev.off(as.integer(dev.cur())))在你的脚本中使用,甚至补丁dev.off只返回其值dev.cur()不是null设备的值,并将补丁发送给R的维护者.

此外,graphics.off()调用dev.off()所有设备,不返回任何内容.


Kar*_*ius 6

最近遇到同一问题,并注意到此处的答案中未提及另一种可能性:

invisible(dev.off())
Run Code Online (Sandbox Code Playgroud)

dev.off()与将输出分配给garbagevariable:will相比,这将隐藏输出,并且不会创建其他变量garbage <- def.off()