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])
等没有运气。我所见过的大多数文档都不适用于传递文件名。任何人都可以想出解决方案吗?
正如我在我的评论说,我会用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的,但有人可能做到这一点已经...
几乎可以工作,但在尝试执行read.table时会中断,因为“batch.csv”不会被识别为正确的文件名,而会被识别为字符串。我虽然给它的完整路径可能会有帮助,但随后因空间而断裂。目前,我从所有文件所在的目录(.r,.txt和.csv)运行它。 – Benjamin 2011-01-26 18:41:27
尝试
fn="batch.csv"; R CMD BATCH --slave "--args $fn" myscript.r output.txt
我会建议使用的`Rscript`代替的r CMD BATCH`。你使用什么版本的R? – 2011-01-26 18:29:06
使用R 2.12.0。我可以使用相同的语法使用Rscript? – Benjamin 2011-01-26 18:30:28
不,语法不同。比较`?Rscript`和`?BATCH`。 – 2011-01-26 18:31:43