如何使用Rscript将控制台输出写入文本文件,就像使用R CMD BATCH一样。

4

过去我曾在Linux服务器上使用R CMD BATCH从命令行执行R代码。我使用的语法是:

R CMD BATCH --no-save --no-restore rcode.r output.txt

上述代码将控制台输出写入 output.txt,可以在脚本运行时进行监视。是否也可以用 Rscript 实现这个功能?我更喜欢使用 Rscript,因为听说 R CMD BATCH 已经被弃用了。
为了澄清我的最初问题,R CMD BATCH 将所有的控制台输出,包括消息、警告和 print() 语句,都写入 output.txt。相比之下,Rscript rcode.r > output.txt 只将 print() 的内容写入文本文件,而将其他所有内容写入终端。我该如何使用 Rscript 复制 R CMD BATCH 的这种行为?
2个回答

5

我经过一番调查发现,至少在我使用的 Linux 系统上,Rscript 只是一个便利函数。如果您调用

Rscript --verbose foobar.r

您将看到底层调用是:

running
  '/usr/lib/R/bin/R --no-echo --no-restore --file=foobar.r'

这意味着--no-echo被固定在Rscript中。

因此,解决方法是运行

/usr/lib/R/bin/R --no-restore --file=foobar.r > output.txt

其中删除了--no-echo,并将输出重定向到文本文件,如@MrFlick所建议的那样。命令将与输出一起回显。

如果要默认删除--no-echo,可以为Rscript创建一个新的别名。例如,在我的.bashrc文件中,我有以下内容:

function Rscript2() { R --no-restore --file="$1"; }
export -f Rscript2

现在,在我的Slurm批处理作业脚本中,我可以运行Rscript2 file.R来得到所需的行为:所有R控制台输出都包含在slurm-*.out文件中。


这在我的作业调度程序上不起作用,因为它只是打开了一个交互式会话。 - Giulio Centorame
你在命令中包含了R脚本的文件名吗?你使用的是哪个操作系统和作业调度程序?@GiulioCentorame - qdread

2

只需像处理其他命令行输出一样将输出重定向到文件中

Rscript rcode.r > output.txt

很遗憾,我还没有能够让这个工作起来。 - qdread
那具体是什么出了问题呢?如果您想要进一步的帮助,提供一些关于具体情况发生了什么的细节会很有帮助。 - MrFlick
你能够解决这个问题吗? - kRazzy R
2
@MrFlick 抱歉没有及时回复和晚了一点。问题在于 R CMD BATCH 将所有控制台输出,包括消息、警告和 print() 语句,都写入到 output.txt 文件中。相比之下,Rscript 只将 print() 的输出写入文本文件,其他所有内容都写入终端。我该如何使用 Rscript 复制 R CMD BATCH 的行为?我也会编辑问题。 - qdread
消息可能会被发送到标准错误而不是标准输出。你使用什么shell来运行命令?通常,>只是重定向标准输出,只要你的shell有其他可用版本来捕获所有输出即可。 - MrFlick

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