在 rmarkdown 中交叉引用 pander-table

Cross referencing pander-table in rmarkdown

尽管关于这个主题的问题很多,尽管我已经阅读了 the manual,包括最后一段,但我还是无法理解它。我找到了 pdf-output 的解决方案,但希望它也适用于 html-output(理想情况下是一种适用于 pdf- 和 html-output 的方法 - 就像我下面使用 opts_knit$get("rmarkdown.pandoc.to") 可悲的是 html).

使用bookdown,很容易参考kabel(Extra)-或flextable-tables,但我的解决方法是pander-tables仅适用于 pdf 输出。任何人都可以指导我如何使 html 也能正常工作吗?

下面的 MWE 示例适用于 pdf,但对最后一个 table 的引用在输出到 html 时中断。

MWE:

---
title: "Untitled"
output:
    bookdown::pdf_document2:
        keep_tex: yes
    bookdown::html_document2: default
---

```{r setup, include=FALSE}
knitr::opts_chunk$set(echo = FALSE)

library(knitr)
library(tidyverse)
library(pander)
library(flextable)
```


```{r}

df <- expand.grid(A = LETTERS[1:2],
              B = letters[3:5], 
                 stringsAsFactors = FALSE)%>%
              mutate( x = round(rnorm(nrow(.)),1))%>%
              arrange(A,B)


```


```{r mypanderworkaround}

addlabref <- function(fcap, flab){

   if (opts_knit$get("rmarkdown.pandoc.to") %in% 
    c("beamer", "latex")){

    lab <- sprintf("\label{tab:%s}",flab)

    sprintf("%s %s", lab, fcap)

  }else{

    lab <- sprintf("\#tab:%s",flab)

    sprintf("<caption>%s %s</caption>", lab, fcap)

  }

}

```


```{r c1}

kable(df, caption = "table with kable")

```

```{r c2}

flextable(df)%>%set_caption(caption = "table with flextable")

```


```{r c3}

pander(df, caption = addlabref("table with pander", "c3") )
```


kable figure is \@ref(tab:c1).

flextable figure is \@ref(tab:c2)

pander figure is \@ref(tab:c3)

这应该有帮助:

我们的table:

<br>
<div style="text-align: center">
   <caption><span id="tab:c3">Table 3: </span>My table is here</caption>
</div>

<div style="width: 50%; margin: 0 auto;">
```{r c3}
pander(head(mtcars[1:5]))
```
</div>

我们的参考:

pander figure is <a href="#tab:c3">3</a>

...看起来像

和你的table是同一个故事:

<br>
<div style="text-align: center">
   <caption><span id="tab:c3">Table 3: </span>My table is here</caption>
</div>

<div style="width: 10%; margin: 0 auto;">
```{r c3}
pander(df)
```
</div>


无处不在:

```{r c3}
pander(df, caption = "(\#tab:table-label) Table caption" )
```

pander figure is \@ref(tab:table-label)

根据@manro 的回答,我将 MWE 中的 addlabref 函数更新为

addlabref <- function(fcap){

sprintf("(\#tab:%s) %s", knitr::opts_current$get("label"), fcap)

}

通过使用knitr::opts_current$get("label"),它保持了kableflextable的行为,使用块名作为标签。 此函数可用于添加标签以引用 pander-caption,如

pander( df, caption = addlabref("my caption") )