如何以编程方式在knitr钩子中设置图形标题?
我想将图标题(如果没有明确定义)设置为块标签。我已经在options,options和hooks上阅读了knitr文档,虽然我认为我理解了正在发挥作用的机制,但我无法让它发挥作用
我的用例可能证明这种行为是正确的:我的工作流最近适合在 Rmd 文件中启动我的数据和可视化探索。我将使用块进行清理,子集等,然后使用每个可视化的样本块。这很快,很脏,意味着最小的降价。当我查看报告(通常呈现为PDF)时,我会看一个数字,并希望直接找到它的来源。虽然数字之前/之后的文字可以提供洞察力,但由于LaTeX数字规则,这不是一个肯定的事情。计算数字是可行的,但不是很容易" (并且很多数字都有问题)。字幕总是带有数字,所以如果我可以默认使用块标签填充标题,那就太棒了。 (是的,它对我有点懒惰。)
MWE低于。
钩子代码运行得很好;钩子中返回的字符串正确显示。但是,数字标题没有改变。 异常:当存在未定义fig.cap
的块时,所有后续块的标题都设置为第一个未标题的块名称;由于opts_chunk
的全球性质,这并不让我感到惊讶,因此这样做了。
我怀疑它可能与"输出挂钩"副" chunk hooks,"但这确实是一个大块的事情,我不想修改情节,只需设置标题。
MWE:
---
title: "Document Title"
author: "My Name"
output:
pdf_document:
fig_caption: yes
---
# Header
```{r setup}
knit_hooks$set(autocap = function(before, options, envir) {
if (before) {
if (is.null(options$fig.cap)) {
options$fig.cap <- options$label
knitr::opts_current$set(fig.cap = options$label)
knitr::opts_chunk$set(fig.cap = options$label) # wrong!
paste('Set: `', options$label, '`, `',
knitr::opts_current$get('fig.cap'), '`', sep = '')
} else {
paste('Kept: `', options$fig.cap, '`', sep = '')
}
}
})
opts_chunk$set(autocap = TRUE)
```
## No Plot
```{r textOnly}
1+1
```
## Caption Already Set
```{r someplot, fig.cap='someplot caption'}
plot(0)
```
## Caption Not Set
```{r anotherPlot}
plot(1)
```
答案 0 :(得分:2)
这样可以吗?我只是修改了knitr内部函数.img.cap
函数which can be found here。
```{r}
.img.cap = function(options) {
if(is.null(options$fig.cap)) options$label else options$fig.cap
}
assignInNamespace(".img.cap", .img.cap, ns="knitr")
```
答案 1 :(得分:0)
有帮助吗?
```{r}
library(knitr)
knit_hooks$set(htmlcap = function(before, options, envir) {
if(!before) {
caption <- ifelse(is.character(options$htmlcap), options$htmlcap, options$label)
paste('<p class="caption">', caption, "</p>", sep="")
}
})
```
```{r Hello, htmlcap=TRUE}
library(ggplot2)
ggplot(diamonds,aes(price,carat)) + geom_point()
```
```{r, htmlcap="Hello again"}
ggplot(diamonds,aes(price,carat)) + geom_point()
```