Gang,
Maybe someone here has a different take on things. I'm afraid I have
no more insights on this unless you explain exactly what you are
trying to achieve, or more importantly why? That may help understand
what the problem really is.
Do you want to save an interactive session for future runs? then
?save.image and all your "answers" are in the environment. In this
case consider putting an "if(!exists('type') | length(type)<1 |
is.na(type))" before "type<- readline(...)" in your script so type
wouldn't be overwritten in subsequent runs.
If your goal is to batch evaluate multiple answer files from users
(why else would you ask questions with readline?), then you should
have enough to go on with my answer and the examples in ?eval.
Elai
On Wed, Feb 8, 2012 at 9:04 AM, Gang Chen <gangchen6 at gmail.com> wrote:
Hi Elai, Thanks a lot for the suggestions! I really appreciate it... Your suggestion of using eval() and creating those answers in a list would work, but there is no alternative to readline() with which I could read the input in batch mode? I'm asking this because I'd like to have the program work in both interactive and batch mode. Thanks again, Gang On Wed, Feb 8, 2012 at 12:50 AM, ilai <keren at math.montana.edu> wrote:
Ahh,
I think I'm getting it now. Well, readlines() is not going to work for
you. The help file ?readline clearly states "In non-interactive use
the result is as if the response was RETURN and the value is ?""?."
The implication is you cannot use it to "insert" different answers as
if you were really there.
How about using eval() instead? You will need to make the answers a
named list (or just assigned objects).
test <- expression({
?if(a>2) print('+')
?else print('I got more')
?b <- b+3 ? # reassign b in the environment
?print(b)
?print(c)
?d^2
})
dump('test',file='myTest.R') ; rm(test)
# make the answers.R file:
a=5 ; b=2 ; c=2 ; d=3
source("myTest.R")
eval(test)
# Now, from the terminal ?R CMD BATCH answers.R out.R
# And here is my $ cat out.R
... flushed
a=5 ; b=2 ; c=2 ; d=3
source("myTest.R")
eval(test)
[1] "+" [1] 5 [1] 2 [1] 9
proc.time()
? user ?system elapsed ?0.640 ? 0.048 ? 0.720 Would this work? Elai On Tue, Feb 7, 2012 at 4:05 PM, Gang Chen <gangchen6 at gmail.com> wrote:
Suppose I create an R program called myTest.R with only one line like
the following:
type <- as.integer(readline("input type (1: type1; 2: type2)? "))
Then I'd like to run myTest.R in batch mode by constructing an input
file called answers.R with the following:
source("myTest.R")
1
When I ran the following at the terminal:
R CMD BATCH answer.R output.Rout
it failed to pick up the answer '1' from the 2nd line in answers.R as
shown inside output.Rout:
source("myTest.R")
input type (0: quit; 1: type1; 2: type2)?
1
[1] 1 What am I missing here? Thanks in advance, Gang