在Windows操作系统中,如何在R命令行中将文件名作为参数传递给脚本?

9
我很难将文件名传递给我的R脚本。该文件是一个CSV文件,其中包含多个运行脚本的批处理参数。我正在尝试在此处包含它,以便用户无需编辑R脚本即可指定该文件的位置。
我的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。你使用的 R 版本是什么? - Joshua Ulrich
我可以使用相同的语法在R 2.12.0中使用Rscript吗? - Benjamin
不,语法是不同的。请比较?Rscript?BATCH - Joshua Ulrich
4个回答

18

如我在评论中所说,我会使用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

使用这个精确的语法,我会得到“错误:找不到函数“batch_args”。如果我加入一个print(args)语句,“batch.csv”已经在那里了。 - Benjamin
我不介意使用Rscript,但我能否像R CMD BATCH --slave一样将输出写入文件?为什么Rscript更好? - Benjamin
@Benjamin:我认为你复制和/或粘贴错了。我发布的代码不可能给你带来那个错误,因为那个错误需要类似于“batch_args()”这样的东西。 - Joshua Ulrich

7
除了使用Rscript(如Josh所说),您还应该使用CRAN包getoptoptparse,因为它们是专门为此目的编写的。

6
“没有运气”是什么意思?文件名在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,但可能已经有人做过了...


没有所谓的“正确文件名”。R将文件名存储在字符串中。fn="batch.csv"; read.csv(fn) 将从文件 batch.csv 中读取。 - Spacedman
好的,我的示例现在从CSV文件中读取,作为概念验证。 - Spacedman
我猜这是 Windows 命令行传递的问题。和你原来提到的 R CMD BATCH 等一样吗? - Spacedman
@Spacedman "--args fn='batch.csv'" 并不是一个 Windows 问题。引号内的所有内容都成为单个参数。你非常清楚这是如何工作的。 - David Heffernan
1
我不知道COMMAND.COM如何处理单引号或双引号。在Windows安装中,我做的第二件事是安装Cygwin。第一件事是安装Firefox以获取Cygwin。 - Spacedman
显示剩余4条评论

2

尝试

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接