【发布时间】:2012-10-15 23:28:25
【问题描述】:
我正在使用 R 的 pipe() 函数来捕获 shell 命令的输出,但我也想从命令中获取退出代码。
我知道我可以在这里使用system2,但我需要管道的优势,即以流方式处理输出的能力。
我正在考虑编写自己的库来包装 popen() 和 pclose() C 函数,以利用 pclose() 返回退出状态这一事实,但也许可以避免这种情况。
有什么建议吗?谢谢!
注意
当然有一些方法可以使用临时文件、命名管道等,但我最好避免使用这些变通方法。我愿意编译一个包含 R->C 函数的共享库(我什至愿意复制粘贴部分 R 源代码),但我不愿意重建 R。
更新
我开始阅读 R 源代码,发现未选中的 pclose 调用:
在src/main/connections.c:
static void pipe_close(Rconnection con)
{
pclose(((Rfileconn)(con->private))->fp);
con->isopen = FALSE;
}
我尝试继续使用实现R_pclose C 函数的方法,该函数复制close() 的R 代码但保存此返回值。不幸的是,我在src/main/connections.c
static Rconnection Connections[NCONNECTIONS];
因为无论如何我都必须运行objcopy --globalize-symbol=Connections libR.so /path/to/my/libR.so 才能访问该变量,看来我最好的解决方案是用我自己的补丁重建 R 以捕获 pclose 返回值。
【问题讨论】:
-
您可以使用命名管道(又名 fifo)来使用带有
system2的流处理,但这意味着将wait=FALSE传递给该函数,因此您仍然不会获得退出状态.