在 R 中的函数中捕获系统命令的输出

Capture output of system command within a function in R

我正在使用包中的函数,该函数使用 system2() 到 运行 函数中的命令。这个特定的命令打印一些东西来标准输出。我想捕获 system2() 调用的输出,但是 capture.output() 不起作用。我了解如何直接 运行 system2() 并捕获标准输出,但不知道如何在这种特定情况下获取它。

简单示例:

my_ls <- function() {
  system2("ls")
  return("Hello")
}
my_ls()
output <- capture.output(my_ls())
output

这是一个解决方案...但请注意,它适用于我的 Linux,可能适用于 Mac,但我怀疑它是否适用于 Windows...

创建两个 Rcpp 函数:

library(Rcpp)
cppFunction('void redir(){FILE* F=freopen("/tmp/capture.txt","w+",stdout);}')
cppFunction('void resetredir(){FILE* F=freopen("/dev/tty","w+",stdout);}')

第一个会将所有内容发送到该文件。第二个将重置它。问题是在第一次交互之后你将看不到任何东西。所以要小心...

所以最初 system2 发送到控制台:

> system2("echo", "hello")
hello

但是在 redir/resetredir 中包装调用将其发送到文件:

> redir(); system2("echo","hello world this time") ; resetredir()
> # prompt returns!

现在我们有:

$ cat /tmp/capture.txt 
hello world this time

如果这是其他包的输出,您必须使用 R 的文件 I/O 例程读取它。

狡猾的一点是在重置代码中使用 /dev/tty - 我不确定它是否适用于 Mac 或 Windows。如果您不关心重置 stdout 则跳过它,并确保您知道如何在不看您键入的内容的情况下使用 R。我也不确定这是否适用于 RStudio,它可能具有不同的控制台概念....