在 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")
,它保持了kable
和flextable
的行为,使用块名作为标签。
此函数可用于添加标签以引用 pander-caption,如
pander( df, caption = addlabref("my caption") )
尽管关于这个主题的问题很多,尽管我已经阅读了 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")
,它保持了kable
和flextable
的行为,使用块名作为标签。
此函数可用于添加标签以引用 pander-caption,如
pander( df, caption = addlabref("my caption") )