Passing command line arguments to R CMD BATCH Passing command line arguments to R CMD BATCH r r

Passing command line arguments to R CMD BATCH


My impression is that R CMD BATCH is a bit of a relict. In any case, the more recent Rscript executable (available on all platforms), together with commandArgs() makes processing command line arguments pretty easy.

As an example, here is a little script -- call it "myScript.R":

## myScript.Rargs <- commandArgs(trailingOnly = TRUE)rnorm(n=as.numeric(args[1]), mean=as.numeric(args[2]))

And here is what invoking it from the command line looks like

> Rscript myScript.R 5 100[1]  98.46435 100.04626  99.44937  98.52910 100.78853

Edit:

Not that I'd recommend it, but ... using a combination of source() and sink(), you could get Rscript to produce an .Rout file like that produced by R CMD BATCH. One way would be to create a little R script -- call it RscriptEcho.R -- which you call directly with Rscript. It might look like this:

## RscriptEcho.Rargs <- commandArgs(TRUE)srcFile <- args[1]outFile <- paste0(make.names(date()), ".Rout")args <- args[-1]sink(outFile, split = TRUE)source(srcFile, echo = TRUE)

To execute your actual script, you would then do:

Rscript RscriptEcho.R myScript.R 5 100[1]  98.46435 100.04626  99.44937  98.52910 100.78853

which will execute myScript.R with the supplied arguments and sink interleaved input, output, and messages to a uniquely named .Rout.

Edit2:
You can run Rscript verbosely and place the verbose output in a file.

Rscript --verbose myScript.R 5 100 > myScript.Rout


After trying the options described here, I found this post from Forester in r-bloggers . I think it is a clean option to consider.

I put his code here:

From command line

$ R CMD BATCH --no-save --no-restore '--args a=1 b=c(2,5,6)' test.R test.out &

Test.R

##First read in the arguments listed at the command lineargs=(commandArgs(TRUE))##args is now a list of character vectors## First check to see if arguments are passed.## Then cycle through each element of the list and evaluate the expressions.if(length(args)==0){    print("No arguments supplied.")    ##supply default values    a = 1    b = c(1,1,1)}else{    for(i in 1:length(args)){      eval(parse(text=args[[i]]))    }}print(a*2)print(b*3)

In test.out

> print(a*2)[1] 2> print(b*3)[1]  6 15 18

Thanks to Forester!


You need to put arguments before my_script.R and use - on the arguments, e.g.

R CMD BATCH -blabla my_script.R

commandArgs() will receive -blabla as a character string in this case. See the help for details:

$ R CMD BATCH --helpUsage: R CMD BATCH [options] infile [outfile]Run R non-interactively with input from infile and place output (stdoutand stderr) to another file.  If not given, the name of the output fileis the one of the input file, with a possible '.R' extension stripped,and '.Rout' appended.Options:  -h, --help        print short help message and exit  -v, --version     print version info and exit  --no-timing           do not report the timings  --            end processing of optionsFurther arguments starting with a '-' are considered as options as longas '--' was not encountered, and are passed on to the R process, whichby default is started with '--restore --save --no-readline'.See also help('BATCH') inside R.