[R] Setting up infile for R CMD BATCH

Gang Chen gangchen6 at gmail.com
Wed Feb 8 20:39:54 CET 2012


Sorry Elai for the confusions.

Let me try to reframe my predicament. The main program "myTest.R" has
been written in interactive mode with many readline() lines embedded.
Suppose a user has already run the program once before in interactive
mode with all the answers saved in a text file called answer.R. Now
s/he does not want to go through the interactive again because it's a
tedious process, and would like to run the program but in batch mode
with answer.R. And that's why I tried the following which didn't pan
out:

R CMD BATCH answer.R output.Rout

Of couse I could rewrite a separate program specifically for batch
mode as you suggested previously with eval(), for example. However, is
there an approach to keeping the original program so that the user
could run both interactive and batch mode? That probably requires
modifying the readline() part, but how?

Thanks,
Gang


On Wed, Feb 8, 2012 at 2:08 PM, ilai <keren at math.montana.edu> wrote:
> 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



More information about the R-help mailing list