2016-04-29 13 views
16

この質問は動機づけられましたRmarkdown not outputting results of system command to html fileです。なんらかの理由で、system()の出力がまたはcapture.output()でキャプチャできないため、現在のところknitrが出力を記録する方法はありません。例えば、Rコンソールで:capture.output(system('ls'))character(0)あるのでsystem()の出力をキャプチャする方法

> system('ls') 
DESCRIPTION 
NAMESPACE 
R 
README.md 
inst 
man 

しかしknitr文書では、あなたはすなわち、出力をキャプチャすることができない、出力は表示されません。もちろん私はcat(system('ls', intern = TRUE), sep = '\n')を私がその質問の答えに言及したようにすることができますが、これは厄介です。 intern = TRUEcat()を使わずにsystem()の出力をキャプチャする方法であるかどうかは疑問です。


更新:私はこの問題を解決するためになさハックのためhttps://github.com/yihui/knitr/issues/1203を参照してください。

答えて

4

あなたはそのマスクbase::system機能knitr::systemを追加することができます。それはsystem::baseだったように、ユーザーはそれに取り組むことができますが、出力はcapture.outputによって捕獲することができます。

system <- function(...) { 
    stopifnot(!any(names(list(...)) %in% "intern")) 
    result <- base::system(..., intern = TRUE) 
    print(result) 
} 

私は、これはややハックであることを、認める、と正直に言うと、私は可能性のある副作用についてはよく分かりません。しかし、私はそれが試してみる価値があると思う。

+0

ありがとう!私はこれを知っていましたが、 'system()'の出力をキャプチャする方法を見つけることができれば、それを使用しませんでした。ジョシュア・ウルリッヒの答えの下で私のコメントを参照してください。 –

+0

@Yihuiそれは悪いことではありません - 特に 'system />の' ignore.stdout'と 'ignore.stderr'オプションは'>/dev/null'や '2/dev/null'を追加するだけです'コマンド'へのリダイレクト(:) – daroczig

5

systemが実行されたコマンドによって返された値を目に見えない形で返すように見えるため、少なくとも* nixシステムではこれを行うことはできませんが、Windows/Macシステムは手元にありません。コマンドの出力をRコンソールにリダイレクトするように見えます。

これは、端末のstdoutがRコンソールの "stdout"と同じではないためです。あなたのRセッションでは、端末のstdoutとRプロセスの出力が混在しています。 capture.outputは、Rプロセスの出力を検索していますが、すべての出力が親プロセスのstdoutに出力されるわけではありません。

stdoutに印刷するプロセスを開始し、バックグラウンドに入れてRを開始すると、 "R出力"にそのプロセスの出力が表示されます。実行した場合と同様にsystem("ping -c5 8.8.8.8") R.

[email protected]: /home/josh 
> ping -c5 8.8.8.8 & R 
[1] 5808 
PING 8.8.8.8 (8.8.8.8) 56(84) bytes of data. 
64 bytes from 8.8.8.8: icmp_seq=1 ttl=46 time=39.9 ms 

R version 3.2.4 Revised (2016-03-16 r70336) -- "Very Secure Dishes" 
Copyright (C) 2016 The R Foundation for Statistical Computing 
Platform: x86_64-pc-linux-gnu (64-bit) 

R is free software and comes with ABSOLUTELY NO WARRANTY. 
You are welcome to redistribute it under certain conditions. 
Type 'license()' or 'licence()' for distribution details. 

    Natural language support but running in an English locale 

R is a collaborative project with many contributors. 
Type 'contributors()' for more information and 
'citation()' on how to cite R or R packages in publications. 

Type 'demo()' for some demos, 'help()' for on-line help, or 
'help.start()' for an HTML browser interface to help. 
Type 'q()' to quit R. 

> 64 bytes from 8.8.8.8: icmp_seq=2 ttl=46 time=38.1 ms 
64 bytes from 8.8.8.8: icmp_seq=3 ttl=46 time=38.3 ms 
64 bytes from 8.8.8.8: icmp_seq=4 ttl=46 time=38.4 ms 
64 bytes from 8.8.8.8: icmp_seq=5 ttl=46 time=38.3 ms 

--- 8.8.8.8 ping statistics --- 
5 packets transmitted, 5 received, 0% packet loss, time 4003ms 
rtt min/avg/max/mdev = 38.176/38.656/39.986/0.703 ms 

> q() 
Save workspace image? [y/n/c]: n 
[1]+ Done     ping -c5 8.8.8.8 

[email protected]: /home/josh 
> 
+1

私は、目に見えない戻り値が問題ではないと思います。私は 'capture.output()'がstdoutをキャプチャすることを期待していますが、それは文書化されているものではありません(ドキュメンテーションは曖昧な単語 "output"を使用しています。例えば、あなたは 'capture.output(function(){print(" Hello world! "); invisible(" hi ")})())'と 'print()'から 'Hello world!'を取り込みます。 。私の実際の質問は 'print()'の出力をキャプチャできる理由ですが、 'system()'の出力はキャプチャできません。 'system()'はstdoutに書き込まれないか、 'capture.output()'は実際にstdoutを取り込みません。 –

+0

@Yihui私は内部のRの専門家ではありませんが、[こちら](https://github.com/wch/r-source/blob/e5b21d0397c607883ff25cca379687b86933d730/src/unix/sys-unix.c#L337)の行_does_は 'system'が' stdout'を使用していると示唆しています(私の期待に反して) – MichaelChirico

+0

@MichaelChirico Cコードを掘り下げてくれてありがとう。次に、私の次の質問は、 'capture.output()'が実際にどのような出力をキャプチャしているのかと思います。 –

関連する問題