Knitr可以根据每个块的R代码动态输出叙述文本吗?

时间:2016-01-04 21:15:42

标签: 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

.....

3 个答案:

答案 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的新引擎来编写块内容而不进行处理;它还尊重块选项echoeval - 当其中任何一个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)}
```