为什么RMarkdown不显示代码输出?
我正在Windows 10上使用RStudio。请帮助我在编写降价文件时获得要包含在输出文档中的R系统函数的输出。我已经尝试了许多组合块选项,我发现在 在控制台中,输出:为什么RMarkdown不显示代码输出?,r,r-markdown,R,R Markdown,我正在Windows 10上使用RStudio。请帮助我在编写降价文件时获得要包含在输出文档中的R系统函数的输出。我已经尝试了许多组合块选项,我发现在 在控制台中,输出: system('java -version') 是: java版本“1.8.0_261” Java(TM)SE运行时环境(build 1.8.0_261-b12) Java HotSpot(TM)64位服务器虚拟机(构建25.261-b12,混合模式) 但是,当我将其放入RMardown文档中时: --- title: &q
system('java -version')
是:
java版本“1.8.0_261”Java(TM)SE运行时环境(build 1.8.0_261-b12)
Java HotSpot(TM)64位服务器虚拟机(构建25.261-b12,混合模式) 但是,当我将其放入RMardown文档中时:
---
title: "Code Chunk Not Displaying Output"
output: html_document
---
```{r test}
system('java -version')
```
不幸的是,区块的格式化输出不是显示我的java版本,而是:
## [1] 0
在前面,使用:
system2(“java”,“-version”,stderr=TRUE)
(如果您想确保调用的任何命令,而不仅仅是java
,那么(1)假设它接受-version
,并且(2)还添加stdout=TRUE
。如果没有要捕获的stdout
,那么它不会造成伤害。)
为什么?
这是关于文件描述符(fd)的(快速)讨论。当程序运行时,它可能会接受文件描述符0上的数据(或其他内容),这通常称为标准输入或stdin
。它可以在任意数量的文件描述符上发出(发送文本/值/数据),但通常大多数程序至少使用fd1(标准输出,stdout
),通常但并不总是使用fd2(标准错误,stderr
)。原因是命令行实用程序可以在stdout
上捕获预期输出,并在stderr
上捕获错误/警告。换言之:
#/--这是重定向stdout
#|/--这是重定向stderr
#v v
$somecommand-arg1-arg2>output.log 2>error.log
将预期(正常)输出发送到文件output.log
,并将任何非标准(或带外或警告或调试或…)发送到error.log
。在许多情况下,一个空的错误.log
是一件好事,也是“预期的”
在我的初始测试期间,由于我没有java,我使用的是ls--version
,而/bin/ls
将其版本信息发送到stdout
。显然,java
使用了stderr
(我最后通过切换到一个应该使用stderr
的命令进行了验证:在没有java
的情况下,最简单的复制方法是:
---
title: "Code Chunk Not Displaying Output"
output: html_document
---
```{r test}
system("ls --versiommmmm", intern = TRUE)
```
其中(1)没有预期的ls:unknown选项--versiommmm
输出,以及(2)返回#[1]2
,指示退出状态为2。(大多数实用程序使用退出状态为0表示“一切正常”,以及其他任何错误。一些实用程序甚至会发出特定错误的特定退出状态,但通常可以安全地假设“not0
表示某些错误条件”。)
为了让R执行系统调用并捕获stderr,我切换到system2
,它允许人们捕获stderr=
(以及stdout=
)
注:
将要运行的命令作为其第一个参数,然后将所有后续参数作为字符向量,如下所示:system2
将使用两个参数调用system2(“java”,c(“Echo”,“喝热java”))
,java
和字符串(实际上,这不太正确……请参阅下一个项目符号)“Echo”
和system
在引用东西方面都做得很差。如果您的任何参数都有嵌入空格,例如前一个项目符号中的调用,那么该命令实际上看起来是单个参数。因此前一个项目符号的命令实际上使用四个参数调用system2
,相当于<代码> C(“Enter”,“Cudie”,“Head”,“Head”,“java”)< /C>。(我和很多人认为这是一个很重要的问题,代码< Stult2S/<代码>。解决方案包括使用<代码> SqOuts自己,或者使用<代码> Pyrxx < /Cuth>包,这是正确的。java
- 不同的参数,其中
的等价物是system(…,intern=TRUE)
…您可以使用system2(…,stdout=TRUE)
stderr=
system(“java-version”,intern=TRUE)
(您看到的是退出代码,其中“0”通常表示“未遇到错误”)。可能与此相关。请尝试system2(“java”,即--version”,stdout=TRUE,stderr=TRUE)
r2evans有效!想从中得出一个正式答案吗?注意,它应该是-version而不是-version还有一件事,stdout参数不是必需的,它有效:system2(“java”,“-version”,stderr=TRUE)