我正在使用system2()
在函数中运行命令的包中的函数。这个特殊命令打印出标准输出的东西。我想捕获system2()
调用的输出,但是capture.output()
不起作用。我了解如何直接运行system2()
并捕获标准输出,但不知道如何在这种特定情况下获取它。
简单示例:
my_ls <- function() {
system2("ls")
return("Hello")
}
my_ls()
output <- capture.output(my_ls())
output
答案 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,它可能有不同的控制台概念....