[R] writing R shell scripts?

Mike Miller mbmiller at taxa.epi.umn.edu
Wed Nov 9 07:58:05 CET 2005


On Wed, 9 Nov 2005, Henrik Bengtsson wrote:

>>> A note of concern: When writing batch scripts like this, be explicit 
>>> and use the print() statement.  A counter example to compare
>>> 
>>> echo "1; 2" | R --slave --no-save
>>> 
>>> and
>>> 
>>> echo "print(1); print(2)" | R --slave --no-save
>>> 
>> 
>> I guess you are saying that sometimes R will fail if I don't use 
>> print(). Can you give an example of how it can fail?

This may have been a misunderstanding because it looks like my R and your 
R are not functioning in the same ways.  More below...


> What I was really try to say is that if you running the R terminal, that 
> is, you "sending" commands via the R prompt, R will take the *last* 
> value and call print()  on it.  This is why you get the result when you 
> type
>
>> 1+1
> [1] 2
>
> Without this "feature" you would have had to type
>> print(1+1)
> [1] 2
>
> to get any results.  Note that it is only the last value calculate, that will 
> be output this way, cf.
>> 1+1; 2+2
> [1] 4


My version of R works differently:

# echo "1+1; 2+2" | R --slave --no-save
[1] 2
[1] 4

It does the same thing from the interactive prompt.  This holds in both of 
these versions of R on Red Hat Linux:

R 1.8.1 (2003-11-21).
R 2.2.0 (2005-10-06).


If I assign the results of earlier computations to variables, then they 
are not printed:

# echo "x <- 1+1; 2+2" | R --slave --no-save
[1] 4


> Or go get the last value calculated by .Last.value, see
>
> echo "$1; out <- .Last.value; write.table(file=stdout(), out, row.names=FALSE, col.names=FALSE); quit()" | /usr/local/bin/R --slave --no-save

Beautiful.  I didn't know about .Last.value, but now that I do, I think we 
can shorten that script to this...

echo "$1; write.table(file=stdout(), .Last.value, row.names=FALSE, col.names=FALSE); quit()" | /usr/local/bin/R --slave --no-save

...because we no longer need the "out" variable.  It seems like one 
problem I'm having is that R returns results of every computation, and not 
just the last one, unless I assign the result to a variable.  Example 
using the doR one-line script above:

# doR 'chol(cov(matrix(rnorm(100*5),c(100,5))))'
          [,1]       [,2]        [,3]          [,4]        [,5]
[1,] 1.021414 0.09806281 0.003275454  0.0009819654  0.05031847
[2,] 0.000000 1.10031274 0.002696835 -0.0990352880  0.17356877
[3,] 0.000000 0.00000000 0.822075977 -0.0353553332 -0.04559222
[4,] 0.000000 0.00000000 0.000000000  0.9367890692 -0.01513027
[5,] 0.000000 0.00000000 0.000000000  0.0000000000  0.97588119
1.02141394873274 0.0980628119885006 0.00327545419626209 0.000981965434760053 0.050318470112499
0 1.10031274450895 0.00269683530006245 -0.0990352879929318 0.173568771318532
0 0 0.82207597738982 -0.0353553332133034 -0.0455922206141078
0 0 0 0.936789069194909 -0.0151302741201435
0 0 0 0 0.975881188029811

# doR 'x <- chol(cov(matrix(rnorm(100*5),c(100,5))))'
1.09005225946311 0.183719241993361 -0.211250918511775 -0.0148273333266647 -0.097633753471306
0 0.990599902490968 0.0546812452445389 -0.0255188599622241 0.0502929718369168
0 0 0.982263267444303 -0.0587151164554906 -0.046018923176493
0 0 0 1.00433563628640 0.222340686806836
0 0 0 0 0.976420329786668

I suppose I can live with that.  Is my R really working differently from 
the R other people are using?


> You may also want to create your own method for returning/outputting 
> data. An ideal way for doing this is to use create a so called generic 
> function, say, returnOutput(), and then special functions for each class 
> of object that you might get returned, e.g. returnOutput.matrix(), 
> returnOutput.list(), etc. Don't forget returnOutput.default().  If you 
> do not understand what I'm talking about here, please read up on 
> S3/UseMethod in R documentation.  It's all in there.  Then you'll also 
> get a much deeper understanding of how print() (and R) works.

Thanks yet again for another great tip!

Mike

-- 
Michael B. Miller, Ph.D.
Assistant Professor
Division of Epidemiology and Community Health
and Institute of Human Genetics
University of Minnesota
http://taxa.epi.umn.edu/~mbmiller/




More information about the R-help mailing list