如何传递多行字符串给Rscript -e命令?

20

有没有一种方法可以在多行中提供代码给Rscript -e

在原始版的R语言中,这是可能的。

R --vanilla <<code
a <- "hello\n"
cat(a)
code

然而,使用 Rscript 时,我会得到两个不同的结果,具体取决于 R 版本。

# R 3.0.2 gives two ignores
Rscript -e '
quote> a <- 3+3
quote> cat(a, "\n")
quote> '
# ARGUMENT 'cat(a,~+~"' __ignored__
# ARGUMENT '")' __ignored__

Rscript -e 'a <- 3+3;cat(a, "\n")'
# ARGUMENT '")' __ignored__

# R 2.15.3 gives an ignore for the multiline, but it works with semicolons
Rscript -e '
quote> a <- 3+3
quote> cat(a, "\n")
quote> '
# ARGUMENT 'cat(a,~+~"\n")' __ignored__

Rscript -e 'a <- 3+3;cat(a, "\n")'
6

我显然使用了错误的语法。正确的做法是什么?


3
如果你正在使用Linux或OS X操作系统,你可以使用littler,该工具似乎允许进行行续写(请参见链接网页上的示例)。 - Josh O'Brien
1
提到正确的工具,自动加1分 :) - Dirk Eddelbuettel
我想这是Rscript中的一个bug?或者至少,这是一个不完全完成的功能?我并不是在批评Rscript,只是观察到换行符并没有按照预期处理。 - Aaron McDaid
1
如果 R --vanilla <<heredoc ... 语法可行,那么有什么理由尝试使用 Rscript -e 呢? - user5359531
1个回答

14
更新:我认为问题在于空格和引号。这个方法在Windows上有效:
Rscript -e "a <- 3+3; cat(a,'\n')"
6

在Mac上,你需要转义转义字符:

Rscript -e 'a <- 3+3; cat(a,"\\n")'

您也可以单独放置每个表达式。

Rscript -e "a <- 3+3" -e "cat(a)"

2
在我的Mac上,使用R 3.0.2时,Rscript -e "a <- 3+3; cat(a,'\n')"无法正常工作,但使用-e可能是一个不错的解决方法。 - nachocab
我现在正在使用Windows,因为我在工作。但是我家里有一台Mac。我回到家后会在那里检查它。 - Carlos Cinelli
1
这在MacOS中有效:Rscript -e 'a <- 3+3; cat(a,"\n")' - Hansi
1
@Hansi 你说得对。我不知道 R 3 会因为 "\n" 而出错,但是 R 2 不会。我想知道为什么。 - nachocab
扩展@Hansi的评论:值得注意的是,外部引号必须是单引号,内部引号必须是双引号,否则该方法将无法工作。 - Thomas Ingalls

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