在bash中传递参数给Rscript的命令行

18

我有一个Bash脚本,它创建了一个CSV文件和一个从该文件创建图形的R脚本。

在Bash脚本的末尾,我调用Rscript Graphs.R 10

我收到的响应如下:

Error in is.vector(X) : subscript out of bounds
Calls: print ... <Anonymous> -> lapply -> FUN -> lapply -> is.vector
Execution halted

我Graphs.R文件的前几行是:

#!/bin/Rscript
args <- commandArgs(TRUE)
CorrAns = args[1]

我不知道我做错了什么?网上的建议似乎告诉我这应该行得通。很难理解commandArgs

4个回答

16

在 args.R 中包含以下内容:

print(commandArgs(TRUE)[1])

并且在 args.sh 文件中添加以下内容:

Rscript args.R 10

我从 bash args.sh 命令中获得以下输出:

[1] "10"

并且没有错误。如果需要,可以使用as.numeric(commandArgs(TRUE)[1])将其转换为数字类型。


谢谢。我发现它返回一个字符串。怎么将其转换为数值?我只是想找到答案。 - samar
@samar print(as.numeric(commandArgs(TRUE)[1])) 打印出 [1] 10 - moinudin
刚刚找到答案。x <- (commandArgs(TRUE)[1]),然后 CorrAns <- eval(parse(text=x))。 - samar
@samar,我非常谨慎地使用“eval”。as.numeric()对您不起作用吗?如果您需要使用“eval”,请在页面末尾的标有“您的答案”的文本框中发表它。然后通过单击答案右上角的勾选框来接受最佳答案。 - moinudin
@Joshua,我已经编辑好了。请阅读何时应该投反对票?。而且,你明显说了你只是猜测。无论如何,我没有进一步辩论的意图。 - moinudin
显示剩余6条评论

6

仅供参考,也许您需要将CorrAns从字符转换为数字,因为?CommandArgs中的Value部分说:

包含可执行文件和用户提供命令行参数的名称的字符向量。

更新:这可能很简单:

#!/bin/Rscript
args <- commandArgs(TRUE)
(CorrAns = args[1])
(CorrAns = as.numeric(args[1]))

谢谢。不太确定如何实现那个。我认为在 R 中,变量名与字符或数字都没有关联。但是我会再次检查 R 入门书籍。 - samar
@samar,我建议尝试使用as.numeric(args[1]),就像我在我的更新答案中所做的那样。 - Joshua Ulrich
非常感谢。这对我来说是一个新网站,就像R对我来说是一种新体验。两者都带来了巨大的满足感。 - samar

1

阅读文档,似乎您需要从调用commandArgs()的代码中删除TRUE,因为您没有使用--args调用脚本。要么这样,要么您需要调用Rscript Graphs.R --args 10

用法

commandArgs(trailingOnly = FALSE)

参数

trailingOnly 逻辑值。只返回--args后面的参数吗?


谢谢。我已经这样做了,但错误信息与我最初报告的相同。 - samar
@samar,请看一下我的新回答,看看是否有帮助? - moinudin

1

Rscript args.R 10 是我们想要传递给 R 脚本的数值。

print(as.numeric(commandArgs(TRUE)[1]) 打印出该值,然后可以将其赋值给一个变量。


这与我的更新答案相同,而你接受为“最佳”的答案并没有回答你的问题。 - Joshua Ulrich
据我所知,Joshua,我根据marcog的答案修改了一下以适应我的需求,然后将其作为“最佳”答案输入。我不记得当时你的最新答案是可见的。但是,我很感激你的帮助。 - samar

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