For what it's worth, I have found one way to achieve what I want,
which is to use "expect", which is installed on many *nix systems. In
case this is useful to anyone else I'm posting a quick example...
$ expect -f test.expect
[1] 7
1: yes
[1] "Answer was yes"
$ cat test.expect
log_user 0
spawn R --quiet --vanilla
set timeout 2
send "print(3+4)\n"
send "source('test.R'); q()\n"
expect -re ">.+\r\n"
interact {
-o
-re ">.+\r\n" {}
}
$ cat test.R
ans <- scan(what=character(0),nlines=1,quiet=T)
print(paste('Answer was',ans))
Thus, I can retain interactivity whilst giving specific "set-up"
commands to R beforehand (in this toy example, just "print(3+4)").
Meanwhile, I avoid trampling on user startup files (i.e. ".Rprofile")
and I don't have to load the default packages manually.
I would still suggest that getting R itself to do this -- most likely
by changing the behaviour of the "-e" option to match that of ruby,
perl and others -- would be very helpful (though I appreciate it may
not be simple).
Alternative suggestions are still welcome, of course.
Regards,
Jon
On 19/12/2007, Jon Clayden <j.clayden at ucl.ac.uk>
wrote:> Dear all,
>
> I am trying to wrap a *nix shell script around R for a particular
> purpose, for which I need to get R to execute predetermined commands
> but retain interactivity and allow user input during their execution.
> A straight redirection of standard input is therefore not appropriate,
> and I don't think "littler" is the solution because I
don't want to
> write an independent R script.
>
> What I want is effectively something like what ruby does with the
'-e'
> option:
>
> $ ruby -e 'gets'
> <waits for input from terminal>
>
> R seems to accept an '-e' option too, even though I can't see
it
> mentioned in the output from 'R -h', but it doesn't work the
same:
>
> $ R --slave --vanilla -e 'scan(what=character(0),nlines=1,quiet=T)'
> character(0)
> $
>
> The only way I can get this to work is by creating an .Rprofile file
> containing the commands I want to run, but this is suboptimal for a
> number of reasons: I have difficulties if an .Rprofile already exists
> in the working directory, the default packages are not loaded, and the
> process doesn't quit if stop() is called.
>
> I have a vague inkling that this may be achievable with a
> pseudoterminal (pty) or named pipe, but if anyone knows a simpler
> route I'd be glad to avoid getting involved in that kind of thing...
>
> Many thanks in advance.
> Jon
>
> ______________________________________________
> R-help at r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-help
> PLEASE do read the posting guide
http://www.R-project.org/posting-guide.html
> and provide commented, minimal, self-contained, reproducible code.
>