Я хочу автоматически перенаправить все графики в файл (причина: см. ниже). Есть ли не-хакерский способ сделать это?
Не имея этого, я на самом деле не боюсь переопределять встроенные функции, я это в отчаянии. Самый простой способ, который я могу придумать, - это подключиться к основной функции создания окна графика и вызвать pdf(…)
, а затем подключиться к функции завершения графика и вызвать там dev.off()
.
Но что это за функции? С помощью отладки я предварительно определил dev.hold
и dev.flush
, но действительно ли это верно для всех? Могу ли я подключиться к этим функциям? Я не могу переопределить их с помощью R.utils
’ reassignInNamespace
, потому что они заблокированы, и простое помещение одноименных функций в глобальное пространство имен не работает (их игнорирует plot
).
Итак, зачем мне делать что-то настолько ужасное?
Поскольку я работаю на удаленном сервере, и, несмотря на все мои попытки и длительные сеансы отладки с поддержкой наших систем, я не могу заставить пересылку X11 работать надежно. Отсутствие возможности предварительного просмотра сюжета делает мой рабочий процесс ужасно неэффективным. Я отказался от попыток заставить X11 работать, поэтому теперь я создаю PDF-файлы в своей папке public_html
и просто обновляю браузер.
Это работает довольно хорошо, за исключением того, что очень раздражает и требует много времени, чтобы всегда окружать вызовы функций построения графика pdf(…) … dev.off()
, особенно в интерактивных сеансах, когда вы хотите быстро создать график во время встречи с соавторами. На самом деле, это очень раздражает, и у них (по понятным причинам) не хватает на это терпения.
Сейчас я помогаю себе со следующим определением функции:
preview <- function (.expr, ...) {
on.exit(dev.off())
pdf(PREVIEW_FILE_NAME, ...)
eval(substitute(.expr))
}
Который используется так:
preview(plot(1:100, rnorm(100) * 1:100))
Это работает - хорошо. Но этот рабочий процесс является настоящим узким местом на собраниях, и я хотел бы избавиться от вызова preview
, чтобы максимально упростить его.
Есть шанс вообще?
preview
стоит вам измеримого времени? То есть, если вы запускаете его локально, это стоит. Я ожидал, что большую часть времени будет занимать запись и чтение удаленного файла. Я также ожидаю, что размещение хуков внутриplot
будет не быстрее, чем ваша функцияpreview
. Кстати, я не думаю, что у вас есть возможность использовать какой-либо другой оконный сервер, кроме X11, или просто запускать приложение для удаленного рабочего стола? (или см. хорошее предложение @nograpes) - person Carl Witthoft   schedule 12.07.2013preview(plot(x[1:35],y[31:65],t='l',col=rainbow(40),xlab="wtf", ylab='fubar',main='this is a lot of typing')
занимает заметно больше времени, чем ввод только строкиplot
? Что-то не так, и не в последнюю очередь: если у вас есть соавторы, значит, вы занимаетесь разработкой, а не презентацией, верно? Таким образом, им вряд ли стоит ждать порядка нескольких секунд, чтобы увидеть, как пишется и строится новый алгоритм. Так что же происходит на самом деле? - person Carl Witthoft   schedule 12.07.2013Plot <- function(...) {on.exit(dev.off()); pdf(file="foo.pdf"); plot(...)}
? - person Joshua Ulrich   schedule 12.07.2013preview()
занимает много времени, но если вы находитесь на совещании и хотите попробовать вывести данные на график по-новому, введите в консоли останавливает разговор. Это неудобно и раздражает. И поэтому вы печатаете быстро. И делать ошибки. И это занимает больше времени. И это становится более раздражающим. Кстати, это касается не только меня, я видел это и у других. Итог: безобидный маленькийpreview()
вреден. - person Konrad Rudolph   schedule 12.07.2013preview
подходом, поскольку, очевидно, внутри скрипта я не используюpreview
, я (явно, черезpdf(…)…dev.off()
) рисую в какой-то другой выходной файл. Так что мне действительно нужно иметь возможность просто вставить функцию построения графика и получить эту работу. - person Konrad Rudolph   schedule 12.07.2013plot
, а не с множеством других функций построения графиков, верно? - person Konrad Rudolph   schedule 12.07.2013closeall()
, гдеclosall <- function() dummy<-capture.output(replicate(length(dev.list()), dev.off()))
. (Это предполагает, что вы также приняли предложение Грега Сноу установитьoptions(device="pdf")
.) - person Josh O'Brien   schedule 13.07.2013