getopt is an R package designed to be used with Rscript to write
"#!"-shebang scripts that accept short and long flags/options. Many users will
prefer using instead the package optparse
which adds extra features (automatically generated help option and usage,
support for default values, basic positional argument support).
To install the last version released on CRAN use the following command:
install.packages("getopt")To install the development version use the following command:
install.packages("remotes")
remotes:install_github("trevorld/r-getopt")An example Rscript using getopt with R 4.4+ (i.e. support for %||% and |>):
#!/path/to/Rscript
library('getopt')
# get options, using the spec as defined by the matrix
# fmt: skip
spec <- matrix(c(
'verbose', 'v', 2, "integer",
'help' , 'h', 0, "logical",
'count' , 'c', 1, "integer",
'mean' , 'm', 1, "double",
'sd' , 's', 1, "double"
), byrow = TRUE, ncol = 4L)
opt <- getopt(spec)
# if help was asked for print a friendly message and exit
if (isTRUE(opt$help)) {
getusage(spec) |> cat()
quit(status = 0)
}
# set reasonable defaults for options that were not specified
opt$mean <- opt$mean %||% 0
opt$sd <- opt$sd %||% 1
opt$count <- opt$count %||% 10L
opt$verbose <- opt$verbose %||% FALSE
# print some progress messages to stderr, if requested
if (opt$verbose) write("writing...", stderr())
# do some operation based on user input
rnorm(opt$count, mean = opt$mean, sd = opt$sd) |> cat(sep="\n")An example Rscript using getopt for old versions of R:
#!/path/to/Rscript
library('getopt')
# get options, using the spec as defined by the matrix
spec <- matrix(c(
'verbose', 'v', 2, "integer",
'help' , 'h', 0, "logical",
'count' , 'c', 1, "integer",
'mean' , 'm', 1, "double",
'sd' , 's', 1, "double"
), byrow = TRUE, ncol = 4L)
opt <- getopt(spec)
# if help was asked for print a friendly message and exit
if (!is.null(opt$help)) {
cat(getusage(spec))
quit(status = 0)
}
# set reasonable defaults for options that were not specified
if (is.null(opt$mean)) opt$mean <- 0
if (is.null(opt$sd)) opt$sd <- 1
if (is.null(opt$count)) opt$count <- 10L
if (is.null(opt$verbose)) opt$verbose <- FALSE
# print some progress messages to stderr, if requested
if (opt$verbose) write("writing...", stderr())
# do some operation based on user input
cat(rnorm(opt$count, mean = opt$mean, sd = opt$sd), sep = "\n")