在 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,它可能具有不同的控制台概念....
我正在使用包中的函数,该函数使用 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,它可能具有不同的控制台概念....