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。一旦完成了很多绘图,或者对于绘图到多个文件的更复杂的脚本,这将是一个真正的麻烦。

有什么方法可以抑制这个消息吗?

4

5 回答 5

44

我没有充分的理由知道dev.off(),与设备相关的函数不同,比如png()返回一个值:“新活动设备的编号和名称”。该值是回显到标准输出的值。

因此,只需将其放在某处即可实现抑制它,即

garbage <- dev.off()
于 2009-04-15T07:59:03.777 回答
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>

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

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

于 2009-04-15T11:45:36.180 回答
10

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

invisible(dev.off())

这将隐藏输出dev.off()并且不会创建其他变量,这与将输出分配给变量不同garbagegarbage <- def.off()会。

于 2018-06-16T12:47:45.863 回答
2

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

于 2009-04-15T08:51:01.157 回答
2

您可以使用littler代替,这是 a) 编写 R 'scripts' 的一种更简单的方法,并且 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 也可能会起作用;我倾向于更小。

于 2009-07-23T13:18:21.290 回答