Подавление вывода "нулевого устройства" с 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
. После того, как будет сделано много участков, или для более сложных скриптов, которые будут отображаться в нескольких файлах, это становится настоящей проблемой.
Есть ли способ подавить это сообщение?
Ответы
Ответ 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, вероятно, тоже будет работать; Я предпочитаю меньший.