我正在考虑开发一个.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
.....
答案 0 :(得分:4)
当knitr
处理文档时,文档被分为两类输入:普通文本和代码块。普通文本保持不变并传递给输出文件。因此,如果应该动态包含纯文本,那么它必须 in 一个块。
代码块根据其options进行评估。在当前情况下,最重要的选项是:
eval
echo
results
engine
eval
确定是否评估了一个块; eval = FALSE
跳过了这个块。 echo
确定是否显示块的源代码。 results
确定如何处理块的输出。默认情况下(results = "markup
),输出挂钩用于将特定于文档类型的标记应用于输出。 results = "asis"
表示输出文件中包含所有输出" as-is",没有任何修改。
有了这三个选项,可以完成以下任务:
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.")
```
输出:
This is some text ...
... that is dynamically generated.
请注意,第一个块未评估,因为eval = FALSE
。
然而,来自R chunk的cat()
大量文本很麻烦。 engine
可以用来克服这个问题。除了R之外,还有other engines可用于评估块,其中包括(当前未记录的?)引擎asis
。这个引擎非常简单。来自knitr
NEWS file:
添加了一个名为
asis
的新引擎来编写块内容而不进行处理;它还尊重块选项echo
和eval
- 当其中任何一个FALSE
时,块将被隐藏;这使得有条件地写文本成为可能
将asis
引擎与以下语法糖(source)结合起来
对于语言引擎,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.
```
答案 1 :(得分:0)
上面的答案都很好,但很复杂。使用内联代码,如评论中建议的那样。
The mean of x is `r mean(x)` which is very high...
修改强> 因为这被选为答案。我会详细说明。 您可以使用if()或ifelse()或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...
答案 2 :(得分:0)
以下内容将打印标题,并根据设置条件(x)的变量在该标题后执行代码块。
```{r,}
x<- FALSE
Title <- ifelse(x, "My header","")
```
## `r Title`
```{r, echo=FALSE}
if(x) {print(1:5)}
```