簡體   English   中英

將 fig.cap 設置為 options$label

[英]set fig.cap to options$label

如何以編程方式在 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 內部函數.img.cap函數。

```{r}
.img.cap = function(options) {
  if(is.null(options$fig.cap)) options$label else options$fig.cap
}
assignInNamespace(".img.cap", .img.cap, ns="knitr")
```

它有幫助嗎?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM