【问题标题】:Suppressing "null device" output with R in batch mode在批处理模式下使用 R 抑制“空设备”输出
【发布时间】: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())
  • 垃圾

标签: r bash plot suppress-warnings


【解决方案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 源进行更多修改。例如,仅给出变量名称的正常变量打印默认情况下也是无声的。
        猜你喜欢
        • 2011-08-15
        • 1970-01-01
        • 2020-11-16
        • 1970-01-01
        • 2018-04-15
        • 2016-11-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多