Подавление вывода «нулевого устройства» с помощью R в пакетном режиме - PullRequest
33 голосов
/ 15 апреля 2009

У меня есть ряд скриптов 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. После того, как будет сделано много сюжетов или для более сложных сценариев, отображающих несколько файлов, это станет настоящей проблемой.

Есть ли способ подавить это сообщение?

Ответы [ 5 ]

39 голосов
/ 15 апреля 2009

Безо всякой на то причины я знаю, что dev.off(), в отличие от функций, связанных с устройством, таких как png(), возвращает значение: «номер и имя нового активного устройства». Именно это значение отражается в stdout.

Таким образом, подавить его можно, просто поместив его куда-нибудь, т. Е.

garbage <- dev.off()
20 голосов
/ 15 апреля 2009

Одной из приятных особенностей 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() для всех устройств и ничего не возвращает.

5 голосов
/ 16 июня 2018

Недавно столкнулся с той же проблемой и заметил, что в ответах здесь не упоминается еще одна возможность:

invisible(dev.off())

Это скроет вывод из dev.off() и не создаст дополнительные переменные в отличие от назначения вывода переменной garbage: garbage <- def.off() будет.

2 голосов
/ 23 июля 2009

Вместо этого вы можете использовать littler , который а) является более простым способом написания R-скриптов и б) подавляет вывод, так что вы получаете побочный эффект молчания 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, вероятно, тоже будет работать; Я склонен предпочесть Литтлер.

2 голосов
/ 15 апреля 2009

Другой вариант - использовать sink() и выводить все в файл журнала, чтобы при необходимости проверить работоспособность графиков.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...