Заставить R (пакет статистики) ждать появления запроса клавиатуры при запуске в bash-скрипте - PullRequest
8 голосов
/ 05 октября 2011

Я использую R для генерации серии графиков в цикле, когда пользователь нажимает клавишу ввода, чтобы указать, что он видел график, и пришло время двигаться дальше. Это интерактивные вращающиеся графики, созданные с помощью пакета rgl, и поэтому использование чего-то вроде Sys.sleep () недостаточно хорошо.

В настоящее время я могу использовать readline (), которая работает при поиске R в интерактивном режиме. Однако, если я хочу запустить свой R-скрипт в bash-скрипте, все графики будут мигать перед экраном. Это происходит, если я вызываю R, используя:

R --no-save -f myfile.r
R --no-save -e "source('myfile.r')"
R --no-save << myfile.r

Как заставить R приостановить и подождать, пока пользователь нажмет кнопку при запуске в качестве подпроцесса bash?

Ответы [ 5 ]

3 голосов
/ 15 августа 2012

Это поздний ответ, но моя цель была схожей: при выполнении Rscript должно появиться окно rgl с графиком и ничем иным, и оно должно оставаться там до тех пор, пока окно не будет закрыто, т.е. окно rgl не должно закрываться.

Чтобы добиться этого, я просто поместил это в конец скрипта R, и график rgl останется там для манипуляций, пока вы не выйдете из окна, потребляя немного процессорного времени:

play3d(function(time) {Sys.sleep(0.01); list()} )

Для обычногоГрафики 2D R, locator() работает аналогично или locator(1), если один щелчок должен закрыть окно графика.

3 голосов
/ 05 октября 2011

Используйте это:

readLines("stdin", n = 1)

Получит реальное stdin вместо того, что stdin() использует.

Я бы вызвал его:

Rscript myfile.r
2 голосов
/ 05 октября 2011

Я не уверен, есть ли простой способ ожидания ввода с клавиатуры, но по крайней мере вы можете подождать щелчок мыши .Не элегантно, но попробуйте этот скрипт:

quartz() # or maybe windows() in windows
for (i in 1:5) {plot(i, i); locator(1)}
1 голос
/ 05 октября 2011

Вот пример сценария, который работает для меня (проверил ваш первый метод вызова в Windows). Он использует пакет tcltk и создает дополнительное маленькое окно с одной кнопкой, сценарий приостанавливается (но все же позволяет вам взаимодействовать с окном rgl), пока вы не нажмете кнопку «продолжить» при нажатии клавиши, пока это окно активен, затем продолжите работу со сценарием.

library(tcltk)
library(rgl)

mywait <- function() {
    tt <- tktoplevel()
    tkpack( tkbutton(tt, text='Continue', command=function()tkdestroy(tt)),
        side='bottom')
    tkbind(tt,'<Key>', function()tkdestroy(tt) )

    tkwait.window(tt)
}


x <- rnorm(10)
y <- rnorm(10)
z <- rnorm(10)

plot3d(x,y,z)

mywait()

x <- rnorm(100)
y <- rnorm(100)
z <- rnorm(100)

plot3d(x,y,z)

mywait()

cor(x,y)
0 голосов
/ 05 октября 2011

plot.lm использует devAskNewPage(TRUE);возможно, это также сработало бы здесь.

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