在R

时间:2016-03-17 06:12:35

标签: r system

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

简单示例:

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

1 个答案:

答案 0 :(得分:0)

这是一个解决方案......但要注意,它适用于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,它可能有不同的控制台概念....