R命令行将文件名传递给参数中的脚本(Windows)

Ben*_*min 9 command-line arguments r batch-file

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

我的Windows命令行语法是:

R CMD BATCH --slave "--args fn=batch.csv" myscript.r output.txt
Run Code Online (Sandbox Code Playgroud)

我在R脚本中检索到的最接近的是:

eval(parse(file=commandArgs()[8])))
batch_args = read.table(fn, sep=",")
Run Code Online (Sandbox Code Playgroud)

我曾尝试用commandArgs(trailingOnly=TRUE)parse(text=commandArgs()[8])等,没有运气.我见过的大多数文档都不适用于传递文件名.谁能想到解决方案?

Jos*_*ich 17

正如我在评论中所说,我会用Rscript而不是R CMD BATCH:

Rscript myscript.R batch.csv
Run Code Online (Sandbox Code Playgroud)

其中myscript.R包含:

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


Dir*_*tel 7

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


Spa*_*man 6

"没有运气"是什么意思?文件名在那里,在commandArgs()函数中,你只需要弄清楚如何把它拿出来.代码和错误消息很方便.

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

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

ca = commandArgs(trailingOnly=TRUE)
eval(parse(text=ca))
print(read.csv(fn))
Run Code Online (Sandbox Code Playgroud)

然后运行:

R  --slave "--args fn='batch.csv'" < myscript.r
     A B C
   1 1 2 3
   2 6 8 3
Run Code Online (Sandbox Code Playgroud)

batch.csv是一个简单的csv文件.

您可以在脚本中对"ca"进行循环并对所有内容进行评估.但这有点危险,因为你很容易打破基本功能.

就个人而言,我会遍历ca,为一组已知名称寻找名称=值对,然后设置它们.基本上实现了getopt,但有人可能已经这样做了......