这个问题是由Rmarkdown不输出系统命令结果到HTML文件所激发的。由于某种原因,R中的system()
(或system2()
)函数的输出不能被sink()
或capture.output()
捕获,因此目前没有办法让knitr记录输出内容。例如,在R控制台中:
> system('ls')
DESCRIPTION
NAMESPACE
R
README.md
inst
man
然而在一个knitr文档中,您将看不到输出,因为capture.output(system('ls'))
是character(0)
,即无法捕获输出。当然,我可以像我在那个问题的答案中提到的那样做cat(system('ls', intern = TRUE), sep = '\n')
,但这有点尴尬。我想知道是否有一种方法可以捕获system()
的输出,而不使用intern = TRUE
和cat()
。
更新:请参见https://github.com/yihui/knitr/issues/1203以获取我提供的解决该问题的hack。
capture.output()
捕获stdout,尽管这不是文档中所记录的(文档使用了一个模糊的词“output”,我不知道它是否意味着stdout)。例如,您可以capture.output((function() {print("Hello world!"); invisible("hi")})())
,它会从print()
中捕获Hello world!
。我的实际问题是为什么print()
的输出可以被捕获,但system()
的输出却不能。要么是system()
不写入stdout,要么是capture.output()
并没有真正捕获stdout。 - Yihui Xiesystem
函数正在使用stdout
(与我的预期相反)。 - MichaelChiricocapture.output()
究竟捕获了什么样的输出。 - Yihui Xiecapture.output
的空间,该版本将拦截终端的stdout
以及R控制台的输出? - MichaelChirico