如何使用R CMD BATCH禁止输出行号?

12

如果我有一个 R 脚本:

print("hi")
commandArgs()

我使用以下方式运行它:

r CMD BATCH --slave --no-timing test.r output.txt

输出将包含:

[1] "hi"
[1] "/Library/Frameworks/R.framework/Resources/bin/exec/x86_64/R"
[2] "-f"                                                         
[3] "test.r"                                                     
[4] "--restore"                                                  
[5] "--save"                                                     
[6] "--no-readline"                                              
[7] "--slave"                                                    

如何禁止在输出中显示行号[1]..[7],以便只显示脚本的输出结果?


@aL3xa 如果你把它写成答案,我可能会投票支持。但是作为评论,我忽略了它——认为“cat与任何事情有什么关系?” :) - David J.
4个回答

14

如果你想要在输出中抑制行号([1][2],...),请使用 cat 替代 print

我认为你还将需要传递命令行参数。我认为最简单的方法是使用 RScript 的shebang创建一个文件:

例如,创建名为 args.r 的文件:

#!/usr/bin/env Rscript
args <- commandArgs(TRUE)
cat(args, sep = "\n")
让它可执行,使用 chmod +x args.r 命令,然后你可以用 ./args.r ARG1 ARG2 运行它。
顺便说一下,使用 R CMD BATCH ... 语法传递命令行参数很痛苦。这是如何做到的:R CMD BATCH "--args ARG1 ARG2" args.r 注意引号。更多讨论请参见这里
更新:根据 @mbq 的评论(感谢!),将上面的 shebang 行从#!/usr/bin/Rscript 更改为 #!/usr/bin/env Rscript

这个shebang不太幸运,因为在各种发行版(和32-64位版本)中,Rscript会跳跃文件系统。然而,env来拯救这一天,#!/usr/bin/env Rscript应该总是有效的。 - mbq
@mbq 虽然我的原始shebang不太幸运,但是你的评论很有帮助,所以谢谢你。 - David J.

5

是的,mbq是正确的 - 使用Rscript,或者如果你喜欢的话,使用littler

$ cat /tmp/tommy.r 
#!/usr/bin/r

cat("hello world\n")
print(argv[])
$ /tmp/tommy.r a b c
hello world
[1] "a" "b" "c"
$

您可能需要查看CRAN包getoptoptparse,以进行参数解析,就像在其他脚本语言中一样。


这个答案是误导性的。我认为问题不在于如何调用R脚本,而是使用cat而不是print来解决问题。 - David J.

2

使用 commandArgs(TRUE) 并用 Rscript 运行您的脚本。

编辑:好吧,我误读了您的问题。David是正确的。


1
在进行命令解析时,使用commandArgs(TRUE)是一个不错的技巧,但它并没有解决问题,即如何抑制"[1]"、"[2]"等。 - David J.
@DavidJames 是的,问题有误导性,因此回答如此。 - mbq

0

阻止Rscript在print输出中添加命令编号

默认情况下,R会将print(...)的输出前面添加命令编号,如下所示:

print("we get signal")

生成:

[1] "我们收到信号"

Rscript允许用户更改像print这样的函数的定义,因此默认情况下它符合我们的目的:

print = cat
print("we get signal")

生成:

我们收到信号

请注意,命令编号和双引号已经消失。

使用R的一级函数更好地控制打印:

my_print <- function(x, ...){ 
    #extra shenanigans for when the wind blows from the east on tuesdays, go here. 
    cat(x) 
} 
print = my_print 
print("we get signal") 

输出:

我们收到信号

如果你使用print作为一种简陋的调试工具... 我们不是在嘲笑你,我们是和你一起笑。


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