R命令行将参数传递给脚本(Windows)

问题描述:

我很难将一个文件名传递给我的R脚本。该文件是一个csv文件,其中包含用于脚本多次运行的批处理参数。我试图在这里包含它,以便用户不需要编辑R脚本来指定该文件的位置。R命令行将参数传递给脚本(Windows)

我的Windows命令行语法是:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt 

我得到在我的[R脚本检索此最接近的是这样做的:

eval(parse(file=commandArgs()[8]))) 
batch_args = read.table(fn, sep=",") 

我已经试验了commandArgs(trailingOnly=TRUE)parse(text=commandArgs()[8])等没有运气。我所见过的大多数文档都不适用于传递文件名。任何人都可以想出解决方案吗?

+0

我会建议使用的`Rscript`代替的r CMD BATCH`。你使用什么版本的R? – 2011-01-26 18:29:06

+0

使用R 2.12.0。我可以使用相同的语法使用Rscript? – Benjamin 2011-01-26 18:30:28

+0

不,语法不同。比较`?Rscript`和`?BATCH`。 – 2011-01-26 18:31:43

正如我在我的评论说,我会用Rscript代替R CMD BATCH

Rscript myscript.R batch.csv 

其中myscript.R包含:

args <- commandArgs(TRUE) 
batch_args <- read.table(args[1], sep=",") 
# loop over multiple runs 

你是什么意思'没有运气'?文件名在那里,在commandArgs()函数中,你只需要弄清楚如何解决问题。代码和错误消息很方便。

如果唯一的额外参数是文件名,那么这不是问题,您知道它的位置。当你开始传递更复杂的论证时,会让你困惑的是什么。

你也通过传递'fn = foo.csv'使事情复杂化。只需传递文件名并将其分配给脚本中的fn即可。如果你真的想使用eval你可能需要引用您的文件名,从而myscript.r是:

ca = commandArgs(trailingOnly=TRUE) 
eval(parse(text=ca)) 
print(read.csv(fn)) 

,因此运行:

R --slave "--args fn='batch.csv'" < myscript.r 
    A B C 
    1 1 2 3 
    2 6 8 3 

凡batch.csv是一个简单的CSV文件。

您可以在脚本中对“ca”进行循环并评估所有内容。尽管这很危险,因为你很容易破坏基本的功能。

就我个人而言,我会遍历ca,为已知的一组名称查找name = value对,并设置它们。基本上实现getopt的,但有人可能做到这一点已经...

+0

几乎可以工作,但在尝试执行read.table时会中断,因为“batch.csv”不会被识别为正确的文件名,而会被识别为字符串。我虽然给它的完整路径可能会有帮助,但随后因空间而断裂。目前,我从所有文件所在的目录(.r,.txt和.csv)运行它。 – Benjamin 2011-01-26 18:41:27

除了使用Rscript(如Josh说的),您还应该使用CRAN软件包getoptoptparse,因为它们是为了这个目的而编写的。

尝试

fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt