Answers:
德克的答案就是您需要的一切。这是一个最小的可复制示例。
我制作了两个文件:exmpl.bat
和exmpl.R
。
exmpl.bat
:
set R_Script="C:\Program Files\R-3.0.2\bin\RScript.exe"
%R_Script% exmpl.R 2010-01-28 example 100 > exmpl.batch 2>&1
或者,使用Rterm.exe
:
set R_TERM="C:\Program Files\R-3.0.2\bin\i386\Rterm.exe"
%R_TERM% --no-restore --no-save --args 2010-01-28 example 100 < exmpl.R > exmpl.batch 2>&1
exmpl.R
:
options(echo=TRUE) # if you want see commands in output file
args <- commandArgs(trailingOnly = TRUE)
print(args)
# trailingOnly=TRUE means that only your arguments are returned, check:
# print(commandArgs(trailingOnly=FALSE))
start_date <- as.Date(args[1])
name <- args[2]
n <- as.integer(args[3])
rm(args)
# Some computations:
x <- rnorm(n)
png(paste(name,".png",sep=""))
plot(start_date+(1L:n), x)
dev.off()
summary(x)
将两个文件保存在同一目录中并启动exmpl.bat
。结果是:
example.png
有一些情节exmpl.batch
完成所有工作您还可以添加一个环境变量%R_Script%
:
"C:\Program Files\R-3.0.2\bin\RScript.exe"
并在您的批处理脚本中将其用作 %R_Script% <filename.r> <arguments>
RScript
和之间的区别Rterm
:
Rscript
语法更简单Rscript
自动选择x64上的体系结构(有关详细信息,请参见R安装和管理中的2.6子体系结构)Rscript
options(echo=TRUE)
如果需要将命令写入输出文件,则需要在.R文件中将其添加到脚本顶部:
args<-commandArgs(TRUE)
然后,您可以引用传递为的参数args[1]
,args[2]
等等。
然后跑
Rscript myscript.R arg1 arg2 arg3
如果您的args是其中包含空格的字符串,请用双引号引起来。
如果您希望事情变得更好,请尝试library(getopt)...。例如:
spec <- matrix(c(
'in' , 'i', 1, "character", "file from fastq-stats -x (required)",
'gc' , 'g', 1, "character", "input gc content file (optional)",
'out' , 'o', 1, "character", "output filename (optional)",
'help' , 'h', 0, "logical", "this help"
),ncol=5,byrow=T)
opt = getopt(spec);
if (!is.null(opt$help) || is.null(opt$in)) {
cat(paste(getopt(spec, usage=T),"\n"));
q();
}
既然optparse
在答案中已经提到过两次,并且它提供了用于命令行处理的综合工具包,下面是一个简短的示例,说明了如何使用它(假设输入文件存在):
脚本R:
library(optparse)
option_list <- list(
make_option(c("-n", "--count_lines"), action="store_true", default=FALSE,
help="Count the line numbers [default]"),
make_option(c("-f", "--factor"), type="integer", default=3,
help="Multiply output by this number [default %default]")
)
parser <- OptionParser(usage="%prog [options] file", option_list=option_list)
args <- parse_args(parser, positional_arguments = 1)
opt <- args$options
file <- args$args
if(opt$count_lines) {
print(paste(length(readLines(file)) * opt$factor))
}
给定一个blah.txt
23行的任意文件。
在命令行上:
Rscript script.R -h
输出
Usage: script.R [options] file
Options:
-n, --count_lines
Count the line numbers [default]
-f FACTOR, --factor=FACTOR
Multiply output by this number [default 3]
-h, --help
Show this help message and exit
Rscript script.R -n blah.txt
输出 [1] "69"
Rscript script.R -n -f 5 blah.txt
输出 [1] "115"
仅供参考:有一个函数args(),它检索R函数的参数,不要与名为args的参数向量混淆
如果您需要指定带有标志的选项(例如-h,-help,-number = 42等),则可以使用R包optparse(灵感来自Python):http : //cran.r-project.org /web/packages/optparse/vignettes/optparse.pdf。
至少这就是我如何理解您的问题,因为我在寻找等效的bash getopt或perl Getopt或python argparse和optparse时找到了这篇文章。
我只是整理了一个不错的数据结构和处理链来生成这种切换行为,不需要任何库。我确信它将被实施多次,并且偶然发现了这个线程以查找示例-认为我会参与进来。
我什至没有特别需要标记(这里唯一的标记是调试模式,创建一个变量,我将其作为启动下游功能的条件进行if (!exists(debug.mode)) {...} else {print(variables)})
检查。下面的标记检查lapply
语句产生的内容与以下内容相同:
if ("--debug" %in% args) debug.mode <- T
if ("-h" %in% args || "--help" %in% args)
args
从命令行参数读取的变量在哪里(字符向量,c('--debug','--help')
例如,当您在其上提供时)
它可用于其他任何标志,并且避免了所有重复,并且没有库,因此没有依赖项:
args <- commandArgs(TRUE)
flag.details <- list(
"debug" = list(
def = "Print variables rather than executing function XYZ...",
flag = "--debug",
output = "debug.mode <- T"),
"help" = list(
def = "Display flag definitions",
flag = c("-h","--help"),
output = "cat(help.prompt)") )
flag.conditions <- lapply(flag.details, function(x) {
paste0(paste0('"',x$flag,'"'), sep = " %in% args", collapse = " || ")
})
flag.truth.table <- unlist(lapply(flag.conditions, function(x) {
if (eval(parse(text = x))) {
return(T)
} else return(F)
}))
help.prompts <- lapply(names(flag.truth.table), function(x){
# joins 2-space-separatated flags with a tab-space to the flag description
paste0(c(paste0(flag.details[x][[1]][['flag']], collapse=" "),
flag.details[x][[1]][['def']]), collapse="\t")
} )
help.prompt <- paste(c(unlist(help.prompts),''),collapse="\n\n")
# The following lines handle the flags, running the corresponding 'output' entry in flag.details for any supplied
flag.output <- unlist(lapply(names(flag.truth.table), function(x){
if (flag.truth.table[x]) return(flag.details[x][[1]][['output']])
}))
eval(parse(text = flag.output))
请注意,flag.details
此处的命令存储为字符串,然后使用进行评估eval(parse(text = '...'))
。Optparse对于任何严肃的脚本显然都是可取的,但是有时功能最少的代码也很好。
样本输出:
$ RSCRIPT check_mail.Rscript --help --debug打印变量而不是执行函数XYZ ... -h --help显示标志定义