Make R (statistics package) wait for keyboard prompt when run within a bash script

匆匆过客 提交于 2019-12-21 04:21:07

问题


I am using R to generate a series of plots within a loop, with the user hitting the enter key to indicate they have seen the plot and it is time to move on. These are interactive rotatable plots generated with the rgl package and therefore using something like Sys.sleep() is not good enough.

Currently I can use readline() which works find when running R interactively. However, if I want to run my R script within a bash script all the plots appear flashing before the screen. This happens whether I call R using:

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

How do I get R to pause and wait for the user to hit when run as a bash subprocess?


回答1:


Use this:

readLines("stdin", n = 1)

That will get the real stdin instead of what stdin() uses.

I'd invoke it with:

Rscript myfile.r



回答2:


It's a late answer but my goal was similar: Rscript execution should bring up an rgl window with a plot and nothing else, and it should remain there till the window is closed, i.e. the rgl window should not terminate.

To achieve this, I simply placed this at the end of the R script, and the rgl plot will remain there for manipulation until you quit the window, consuming little CPU time:

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

For regular 2D R plots, locator() works similarly, or locator(1) if one click should close the plot window.




回答3:


I'm not sure if there is an easy way to wait a keyboard input, but at least you can wait mouse click.
Not elegant but try this script:

quartz() # or maybe windows() in windows
for (i in 1:5) {plot(i, i); locator(1)}



回答4:


Here is an example script that works for me (tested your first calling method on windows). It uses the tcltk package and creates an extra, small window with a single button, the script will pause (but still allow you to interact with the rgl window) until you either click on the 'continue' button on press a key while that window is active, then continue with the script.

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)



回答5:


plot.lm uses devAskNewPage(TRUE); perhaps that would also work here.



来源:https://stackoverflow.com/questions/7654325/make-r-statistics-package-wait-for-keyboard-prompt-when-run-within-a-bash-scri

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!