Passing arguments to an R script from command lines
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
This post describes how to pass external arguments to R when calling a Rscript with a command line. The case study presented here is very simple: a Rscript is called which needs, as an input, a file name (a text file containing data which are loaded into R to be processed) and which can also accept an optional additional argument (an output file name: if this argument is not provided, the program supplies one by default).
Note: The program just loads a text file containing data, filters out non numeric variables and writes a text file with remaining numeric variables only.
R style
The most natural way to pass arguments from the command line is to use the function commandArgs. This function scans the arguments which have been supplied when the current R session was invoked. So creating a script named sillyScript.R which starts with
#!/usr/bin/env Rscript args = commandArgs(trailingOnly=TRUE) |
and running the following command line
Rscript --vanilla sillyScript.R iris.txt out.txt |
will create a string vector args which contains the entries iris.txt and out.txt. Missing and default arguments can be handled this way:
# test if there is at least one argument: if not, return an error
if (length(args)==0) {
stop("At least one argument must be supplied (input file).n", call.=FALSE)
} else if (length(args)==1) {
# default output file
args[2] = "out.txt"
} |
The simple use case described in the introduction thus gives
## program... df = read.table(args[1], header=TRUE) num_vars = which(sapply(df, class)=="numeric") df_out = df[ ,num_vars] write.table(df_out, file=args[2], row.names=FALSE) |
Finally, the command lines
Rscript --vanilla sillyScript.R iris.txt out.txt |
or
Rscript --vanilla sillyScript.R iris.txt |
will both load the file iris.txt, filter out the non numeric variables and write the resulting data in out.txt. Whereas running
Rscript --vanilla sillyScript.R |
Error: At least one argument must be supplied (input file). Execution halted
python style
One package allows to obtain the same result in a python-like style: the package optparse. The package can be used to perform a similar task. Basically, the package contains the functions
make_optionto declare options, their flags, types, default values and help messages;OptionParserto read the arguments passed to the R script andparse_argsto parse them according to what has been declared thanks tomake_option.
The functions are used as follows:
#!/usr/bin/env Rscript
library("optparse")
option_list = list(
make_option(c("-f", "--file"), type="character", default=NULL,
help="dataset file name", metavar="character"),
make_option(c("-o", "--out"), type="character", default="out.txt",
help="output file name [default= %default]", metavar="character")
);
opt_parser = OptionParser(option_list=option_list);
opt = parse_args(opt_parser); |
which produces a list opt that contains all the arguments sorted by order of appearance in option_list and which can be called by their names as declared in this object: opt$file and opt$out. Then, managing null arguments is performed as follows:
if (is.null(opt$file)){
print_help(opt_parser)
stop("At least one argument must be supplied (input file).n", call.=FALSE)
} |
in which the function print_help print the help page of the option list as declared in the object option_list.
The remaining of the function is almost unchanged:
## program... df = read.table(opt$file, header=TRUE) num_vars = which(sapply(df, class)=="numeric") df_out = df[ ,num_vars] write.table(df_out, file=opt$out, row.names=FALSE) |
If the entire script is saved in a file called yasrs.R,
Rscript --vanilla yasrs.R |
will give
Usage: testScript.R [options] Options: -f CHARACTER, --file=CHARACTER dataset file name -o CHARACTER, --out=CHARACTER output file name [default= out.txt] -h, --help Show this help message and exit Error: At least one argument must be supplied (input file). Execution halted
and
Rscript --vanilla yasrs.R --help |
will print the help
Usage: testScript.R [options] Options: -f CHARACTER, --file=CHARACTER dataset file name -o CHARACTER, --out=CHARACTER output file name [default= out.txt] -h, --help Show this help message and exit
and finally
Rscript --vanilla yasrs.R -f iris.txt |
or
Rscript --vanilla yasrs.R -f iris.txt -o out.txt |
will both create the file out.txt as described in the introduction of this post.
My dearest Céline, I hope that this post is explicit enough so that you can make your choice. Now you know that everything can be done with R, even this kind of map.
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.