Подтвердить что ты не робот

Подавление вывода "нулевого устройства" с 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

Проблема в том, что несмотря на --slave, вызов dev.off() выводит сообщение null device 1. После того, как будет сделано много участков, или для более сложных скриптов, которые будут отображаться в нескольких файлах, это становится настоящей проблемой.

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

4b9b3361

Ответ 1

Одна из приятных вещей в 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()))) в script или даже патче dev.off только для возврата значения dev.cur(), если это что-то другое, чем нулевое устройство, и отправить патч сторонникам R.

Кроме того, graphics.off() вызывает dev.off() для всех устройств и ничего не возвращает.

Ответ 2

По уважительной причине, я знаю, dev.off(), в отличие от связанных с устройством функций, таких как png() возвращает значение: "номер и имя нового активного устройства". Это значение - это то, что отражено в стандартном режиме.

Таким образом, подавление его может быть достигнуто простым размещением его, то есть

garbage <- dev.off()

Ответ 3

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

Ответ 4

Вы можете использовать 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, вероятно, тоже будет работать; Я предпочитаю меньший.