xap*_*ppp 5 r knitr r-markdown
我正在考虑开发一个.rmd文件,该文件可以根据前面的R结果动态地在输出文件(.html,.pdf,...)中编写一些叙述块.简单来说,我希望它的工作方式如下:
```{r,echo=F,include=FALSE}
x=1;
```
##if x=1 then output text below
text1
##if x=2 then output text below
text2
.....
Run Code Online (Sandbox Code Playgroud)
在knitr处理文档时,文档被分成两类输入:普通文本和代码块。普通文本保持不变并传递到输出文件。因此,如果要动态包含纯文本,则它必须位于块内。
代码块根据它们的选项进行评估。在当前情况下,最重要的选项是:
evalechoresultsengine eval确定一个块是否被评估;eval = FALSE跳过块。echo确定是否显示块的源代码。results确定如何处理块的输出。默认情况下 ( results = "markup) 输出挂钩用于将特定于文档类型的标记应用于输出。results = "asis"意味着所有输出都“按原样”包含在输出文件中,没有任何修改。
通过这三个选项,可以实现以下目标:
This is some text ...
```{r, echo = FALSE, eval = FALSE, results = "asis"}
cat("... with a secret inside ...")
```
```{r, echo = FALSE, eval = TRUE, results = "asis"}
cat("... that is dynamically generated.")
```
Run Code Online (Sandbox Code Playgroud)
输出:
This is some text ...
... that is dynamically generated.
Run Code Online (Sandbox Code Playgroud)
请注意,第一个块没有被评估,因为eval = FALSE.
但是,cat()从 R 块中获取大量文本很麻烦。engine可以用来克服这个。除了 R 之外,还有其他引擎可用于评估块,其中包括(当前未记录的?) engine asis。这个引擎非常简单。从knitr新闻文件:
添加了一个名为
asis写入块内容而不处理它的新引擎;它还尊重块选项,echo并且eval-- 当其中一个是 时FALSE,块将被隐藏;这使得有条件地编写文本成为可能
将asis引擎与以下语法糖结合起来(来源)
对于语言引擎,R Markdown 代码块头的语法
```{lang, option=value}`现在可以是(例如```{python}和```{Rcpp}),相当于```{r, engine='lang', option=value}
上面的例子变成:
This is some text ...
```{asis, echo = FALSE}
... with a secret inside ...
```
```{asis, echo = TRUE}
... that is dynamically generated.
```
Run Code Online (Sandbox Code Playgroud)
上面的答案很好,但很复杂。使用内联代码,如评论中建议的那样。
The mean of x is `r mean(x)` which is very high...
Run Code Online (Sandbox Code Playgroud)
编辑: 因为这被选为答案。我会详细说明。您可以使用 if() 或 ifelse() 或 switch()。我最喜欢switch,更快更干净的代码。但是我不确定如何在 switch 中使用 else 语句。
```{r}
x <- 1
```
x is `r if(x==1){"equal to one"} else {"not equal to one"}` which is great...
x is `r ifelse(x==1, "equal to one", ifelse(x==2, "equal to two", "not equal to one or two"))` which is great...
x is `r switch(x, "1" = "equal to one", "2" = "equal to two")` which is great...
Run Code Online (Sandbox Code Playgroud)