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

Posted

技术标签:

【中文标题】R命令行将文件名传递给参数中的脚本(Windows)【英文标题】:R command line passing a filename to script in arguments (Windows) 【发布时间】:2011-06-16 01:01:10 【问题描述】:

我很难将文件名传递给我的 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? 使用 R 2.12.0。我可以使用相同的语法使用 Rscript 吗? 不,语法不同。比较?Rscript?BATCH 【参考方案1】:

“没有运气”是什么意思?文件名就在里面,在 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,查找一组已知名称的名称=值对,然后设置它们。基本上实现了getopt,但可能已经有人这样做了......

【讨论】:

几乎可以工作,但在尝试执行 read.table 时会中断,因为“batch.csv”不是正确的文件名而是字符串。我虽然给它完整的路径可能会有所帮助,但是它会因为空格而中断。目前,我从所有文件所在的目录(.r、.txt 和 .csv)运行它。 没有“正确的文件名”这样的东西。 R 将文件名存储在字符串中。 fn="batch.csv"; read.csv(fn) 将从文件 batch.csv 中读取。 好的,我的示例现在从 csv 文件中读取作为概念验证。 当我从上面运行 R --slave "--args fn='batch.csv'" 我不知道 COMMAND.COM 是如何处理单引号或双引号的。我在 Windows 安装上做的第二件事是安装 Cygwin。首先是安装 Firefox 以获取 Cygwin。【参考方案2】:

正如我在评论中所说,我会使用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”就在那里。 我不介意使用 Rscript,但我可以将输出写入类似于 R CMD BATCH --slave 的文件吗?为什么 Rscript 更好? @Benjamin:我认为您复制和/或粘贴了错误的内容。我发布的代码不可能给你这个错误,因为那个错误需要像batch_args()这样的东西。【参考方案3】:

除了使用 Rscript(正如 Josh 所说)之外,您还应该使用 CRAN 包 getopt 或 optparse,因为它们就是为此目的而编写的。

【讨论】:

【参考方案4】:

试试

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

【讨论】:

以上是关于R命令行将文件名传递给参数中的脚本(Windows)的主要内容,如果未能解决你的问题,请参考以下文章

如何传递文件中包含的命令行参数并保留该文件的名称?

如何让 perl 正确传递具有多个参数和复杂文件路径(空格和符号)的命令行参数?

如何将参数(不是命令行参数)传递给批处理脚本中的函数

在 Windows 中自动/脚本/命令行将 .pem 密钥文件转换为 .ppk

如何通过命令行参数批量执行while循环

参数传递策略 - 环境变量与命令行