【问题标题】:Evaluate inline r code in rmarkdown figure caption评估 rmarkdown 图形标题中的内联 r 代码
【发布时间】:2015-10-09 14:08:41
【问题描述】:

我正在使用 RStudio 和 knitr 将 .Rmd 编​​织到 .docx

我想在图形标题中包含内联代码,例如块选项中类似于以下内容:

fig.cap = "nrow(data) 数据点图"

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

有没有办法让 knitr 评估图形/表格标题中的 r 代码?

【问题讨论】:

  • 请尝试paste("Graph of", nrow(data), "data points")

标签: r knitr r-markdown


【解决方案1】:

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,第一个数字标题也可以工作,因为iris 数据集始终可用(只要已附加datasets)。如果没有eval.after,生成第二个图形标题将失败,因为在评估最后一个块之前data2 不存在。

【讨论】:

  • 我想使用 colnames() 代替,但在我的情况下,它将是一个带有 for 循环的块中 fig.cap 的一部分,该循环在每次迭代中输出不同的图形。每个图表代表第一列与同一数据框的不同列,分别是我希望在每个图表的标题中显示的不同列的名称。是否有可能做到这一点?我尝试了 paste0("graph for",colnames(dataframe)[i]),但在所有实例中都显示相同的 colname。
  • @ForEverNewbie 如果我正确理解你的问题,你需要跳过[i]:试试paste("graph for", colnames(dataframe))
  • 如果图在同一个块中但使用 plot() 独立执行,则有效,但如果它们是 for 循环的一部分,则任何图都没有标题。我的意思是一个简单的例子:{r chunkname,fig.cap=colnames(mtcars)[1:2]} for(i in 2:3){ plot(mtcars$wt,mtcars[,i]) }
猜你喜欢
  • 1970-01-01
  • 2018-01-20
  • 1970-01-01
  • 2018-12-20
  • 1970-01-01
  • 2017-12-08
  • 2021-07-01
  • 2018-10-23
相关资源
最近更新 更多