【问题标题】:set fig.cap to options$label将 fig.cap 设置为 options$label
【发布时间】:2014-11-26 17:54:52
【问题描述】:

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

如果没有明确定义,我想将图形标题设置为块标签。我已经阅读了 optionsoptionshooks 上的 knitr 文档,虽然我认为我了解其中的机制,但我无法让它发挥作用。

我的用例可能证明了这种行为的合理性:我的工作流程最近适应了在 Rmd 文件中开始我的数据和可视化探索。我将使用块进行清理、子集等,然后为每个可视化使用一个示例块。这是快速和肮脏的,意味着最小的降价。当我查看报告(通常呈现为 PDF)时,我会看一个图并想直接找到它的源代码。尽管图形之前/之后的文本可以提供洞察力,但由于 LaTeX 图形规则,这不是确定的事情。计算数字是可行的,但并不“容易”(并且对于许多数字来说会变得有问题)。标题总是与数字一起,所以如果我可以默认使用块标签填充标题,那就太好了。 (是的,我有点懒。)

MWE 在下方。

钩子代码运行得很好;钩子中返回的字符串正确显示。然而,图形标题并没有改变。 例外:当有一个未定义fig.cap的块时,所有后续块的标题都设置为第一个未加标题的块名称;由于opts_chunk 的全球性,这并不让我感到惊讶,所以它已经出局了。

我怀疑它可能与“输出挂钩”副“块挂钩”有关,但这确实是每个块的事情,我不想修改情节,只需设置标题.

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)
```

【问题讨论】:

  • 我是从knitr 列表中的您的问题来到这里的。只有几个选项可以作为您需要的替代/扩展。查看kfigr 包,它处理markdown 中的数字编号。我还在tex 上发布了一个相关问题,可能会有所帮助。
  • 这肯定是相关的,如果没有其他方法,我可能会考虑它。谢谢!

标签: r hook knitr options


【解决方案1】:

这样可以吗?我简单地修改了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")
```

【讨论】:

  • 好的,谢谢!我对它正在修改 knitr 内部结构并不感到特别兴奋,但我还没有找到任何其他解决方案,而且它是用于开发而不是部署的,因此可以接受一个小的 hack。太好了!
【解决方案2】:

有帮助吗?

```{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()
```

【讨论】:

  • 谢谢,这符合一些意图(在图像之后立即添加块标签作为文本)。不过,我真的想把它作为图形标题本身。如果我没有找到更好的东西,我会接受这个答案。感谢您的建议! (我的下一个任务是创建一个默认行为,这样没有标题的图形块将自动标记它。)
猜你喜欢
  • 1970-01-01
  • 2014-01-16
  • 1970-01-01
  • 2019-03-25
  • 2016-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多