R のpipe()
関数を使用してシェル コマンドからの出力をキャプチャしていますが、コマンドから終了コードも取得したいと考えています。
ここで使用できることはわかっていsystem2
ますが、パイプの利点、つまりストリーミング方式で出力を処理する機能が必要です。
が終了ステータスを返すという事実を利用するために、popen()
およびC 関数をラップする独自のライブラリを作成することを検討していますが、これは回避できる可能性があります。pclose()
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
Rコードを複製するclose()
が、この戻り値を保存するC関数を実装するアプローチを進めてみました。残念ながら、この静的変数に遭遇しましたsrc/main/connections.c
static Rconnection Connections[NCONNECTIONS];
変数にアクセスするにはとにかく実行objcopy --globalize-symbol=Connections libR.so /path/to/my/libR.so
する必要があるため、pclose の戻り値を取得するために独自のパッチを使用して R を再構築するのが最善の解決策のようです。