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?
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
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.
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)}
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)
plot.lm
uses devAskNewPage(TRUE)
; perhaps that would also work here.