Оставление графиков, созданных RScript, на экране до взаимодействия с пользователем

У меня есть R-скрипт, который запрашивает базу данных, выполняет некоторый анализ, строит несколько диаграмм на основе текущей системной даты.

Я хочу, чтобы этот скрипт запускался ежедневно при загрузке, я думал, что смогу сделать это довольно просто, используя ярлык для rscript.exe с необходимыми параметрами.

Это работает нормально, однако скрипт завершает работу после запуска, что не очень удобно для просмотра графиков.

Я использую XP и Win7.

Есть ли простой способ сохранить вывод скрипта на экран? Я попытался включить сканирование в скрипт, но оно не приостанавливается.

Я знаю, что мог бы просто открыть rgui и запустить одну строку кода, но план состоит в том, чтобы развернуть это на компьютере коллеги, который совершенно не знаком с R.


person BetaScoo8    schedule 17.11.2011    source источник
comment
Может быть, вывести в графический файл (например, PNG) и вывести его на экран с помощью соответствующего средства просмотра?   -  person Ben Bolker    schedule 17.11.2011
comment
Сочетание этого с Latex (возможно, с использованием Sweave, но возможно и без него) позволит вам создать PDF-файл с отчетом.   -  person Paul Hiemstra    schedule 17.11.2011
comment
Я, к сожалению, не знаком с латексом (хотя посмотрю), и средства просмотра изображений не кажутся очень надежным способом заставить это работать (например, кто-то устанавливает какое-то программное обеспечение камеры, и все ломается). Интересно, может ли пакетный файл помогите, только что попытался, но rscript все еще завершает работу при выходе и закрывает окна графика. Хотя спасибо за идеи.   -  person BetaScoo8    schedule 17.11.2011
comment
Или открыть графический файл в веб-браузере (вас также может заинтересовать пакет brew — проще, чем LaTeX)?   -  person Ben Bolker    schedule 17.11.2011


Ответы (4)


Это работает для меня в Linux:

#!/usr/bin/env Rscript

X11()
with(mtcars, plot(mpg, hp))
locator(1)

Пользователь должен щелкнуть окно графика, прежде чем оно исчезнет. Я предполагаю, что это будет работать в Windows с вызовом windows() вместо этого.

person Michael Hoffman    schedule 17.11.2011
comment
Сценарий на самом деле вызывает windows() 4 раза, но все они закрываются, когда сценарий, к сожалению, выходит. Я пытался использовать locator(), но либо я недостаточно быстр в своих кликах, либо он не работает. - person BetaScoo8; 17.11.2011
comment
Предполагается, что окно графика будет оставаться открытым до тех пор, пока пользователь не щелкнет. Извините, это не работает для вас. - person Michael Hoffman; 17.11.2011
comment
Ах, хорошо, может быть, я тоже это реализовал. Спасибо - person BetaScoo8; 17.11.2011
comment
Я понял, что одна из функций не возвращала никаких данных из базы данных и выдавала ошибку, из-за которой этот метод локатора (1) не работал. Теперь он работает, большое спасибо. - person BetaScoo8; 17.11.2011

Возможно, решение Майкла уже работает, но вот что-то, показывающее график внутри кадра tkrplot. Пакет tkrplot (в CRAN) использует расширения tcltk для R и доступен везде.

# From http://stackoverflow.com/questions/3063165/
#     r-building-a-simple-command-line-plotting-tool-
#     capturing-window-close-events

require(tcltk)
library(tkrplot)

## function to display plot, called by tkrplot and embedded in a window
plotIt <- function(){ plot(x=1:10, y=1:10) }
tt <- tktoplevel()       ## create top level window event handler
done <- tclVar(0)        ## variable to wait on    
## bind to the window destroy event, set done variable when destroyed
tkbind(tt,"<Destroy>",function() tclvalue(done) <- 1)
## Have tkrplot embed the plot window, then realize it with tkgrid
tkgrid(tkrplot(tt,plotIt))
tkwait.variable(done)    ## wait until done is true
## script continues, or exits, ... once plot is closed

Если вы просмотрите документацию tcltk для R, вы найдете другие примеры с кнопками «ОК» для закрытия и т. д.

person Dirk Eddelbuettel    schedule 17.11.2011

Как насчет Sys.sleep(1e30)? Это должно ждать достаточно долго.

person Spacedman    schedule 17.11.2011
comment
пользователь должен будет закрыть окно или нажать escape или Ctrl-что-то, чтобы избавиться от него. - person Spacedman; 17.11.2011
comment
чтобы заставить его работать в Windows, просто используйте Sys.sleep(10000), действительно, 1e30 не имеет никакого эффекта (Windows 8 64 бит) - person pommedeterresautee; 30.11.2014

Хорошо, я собирался полностью ссориться из-за всех ответов, которые я видел, на такой вопрос, потому что ни один из них не работал на окнах. readline, tkwait.window, Sys.sleep(1e30), while(TRUE), ничего из этого не сработало.

Но я только что обновил R до версии 3.1.0, и теперь tkwait.window(yourmainwindow) работает, в то время как (TRUE){} работает, хотя Sys.sleep(1e30) по-прежнему не работает.

Неважно... Я использую tkwait.window, потому что это tk, и он ждет моего окна (это то, что я хочу).

Получение, например. из http://www.sciviews.org/_rgui/tcltk/OKtoplevel.html работать... (комментарии удалены для краткости)

require(tcltk)
tt <- tktoplevel()
OK.but <- tkbutton(tt, text = "OK", command = function() tkdestroy(tt))
tkgrid(OK.but)
tkfocus(tt)
tkwait.window(tt) # <-- added this to make the window stay!
person Jimi WIlls    schedule 22.05.2014