将fig.cap设置为选项$ label

时间:2014-11-26 17:54:52

标签: r hook knitr options

如何以编程方式在knitr钩子中设置图形标题?

我想将图标题(如果没有明确定义)设置为块标签。我已经在optionsoptionshooks上阅读了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)
```

2 个答案:

答案 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()
```