在R Markdown中评估内联的R代码以生成图表标题。

19

我正在使用RStudio和knitr将.Rmd文件编织成.docx文件。

我想在图标题中包含行内代码,例如在块选项中添加以下内容:

fig.cap = "Graph of nrow(data) data points"

然而,knitr不会评估此代码,而只是打印未评估的命令。

是否有办法让knitr评估图/表标题中的r代码?


请尝试使用paste("共有", nrow(data), "个数据点的图形") - CL.
1个回答

28

knitr将代码块选项作为R代码进行评估。因此,要在图标题中包含变量值,只需使用pastesprintf组成所需的字符串:

fig.cap = paste("Graph of", nrow(data), "data points")
请注意,如果data是在此代码块内创建的(而不是在前一个代码块中创建),这可能会导致问题,因为默认情况下,代码块选项在代码块本身被评估之前进行评估。
要解决这个问题,请使用软件包选项eval.after,以使选项fig.cap在代码块本身被评估后再进行评估。
library(knitr)
opts_knit$set(eval.after = "fig.cap")

以下是一个完整的示例:

---
title: "SO"
output: 
  word_document: 
    fig_caption: yes
---


```{r fig.cap = paste("Graph of", nrow(iris), "data points.")}
plot(iris)
```


```{r setup}
library(knitr)
opts_knit$set(eval.after = "fig.cap")
```

```{r fig.cap = paste("Graph of", nrow(data2), "data points.")}
data2 <- data.frame(1:10)
plot(data2)
```

即使没有eval.after,第一个图的标题也能正常工作,因为只要datasets已经被加载,iris数据集就一直可用。生成第二个图的标题将会失败,因为在最后一个代码块被执行之前data2不存在。


1
我想使用colnames(),但在我的情况下,它将成为一个带有for循环的块中的fig.cap的一部分,每次迭代都会输出不同的图形。每个图形代表相同数据框的第一列与不同列之间的比较,各自的列名是我想在每个图形的标题中显示的内容。这可行吗?我尝试了paste0("graph for",colnames(dataframe)[i]),但所有实例中都显示相同的列名。 - ForEverNewbie
如果我正确理解了你的问题,你需要跳过 [i]:尝试使用 paste("graph for", colnames(dataframe)) - CL.
1
如果图表在同一个块中但是使用plot()独立执行,那么这将起作用,但是如果它们是for循环的一部分,则没有任何图表的标题。我所说的简单示例是:{r chunkname,fig.cap=colnames(mtcars)[1:2]} for(i in 2:3){ plot(mtcars$wt,mtcars[,i]) } - ForEverNewbie

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接