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.