如何在 RMarkdown 中引用 stargazer 表?

How to ref stargazer tables in RMarkdown?

看来 stargazer 表不能再在 RMarkdown 中引用了。

我已未成功 尝试实施 github 页面上发布的涉及此问题的解决方法 https://github.com/rstudio/bookdown/issues/175

---
title: "Ref Stargazer Test"
output: 
  bookdown::html_document2: default
---

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

```{r results='asis'}
m1 <- lm(mpg ~ cyl + disp, mtcars)
stargazer::stargazer(m1, type = "html", label = "tab:model")
```

Table \@ref(tab:model) should show something on cars.

```{r mytab, results="asis"}
stargazer::stargazer(attitude,
type=ifelse(knitr::is_latex_output(),"latex","html"),
label=knitr::opts_current$get("label"),
title="Stargazer <3 Bookdown")
```

As Table \@ref(tab:mytab) shows, relationships may be hard work but love finds a way.

自 2021 年 7 月起,引用不起作用(rmarkdown 2.9、bookdown 0.22、stargazer 5.2.2)。

还有其他可行的解决方法吗?

我不知道如何使用 stargazer 实现此目的。我会注意到 bookdown cross-references 是一个相当新的功能,stargazer 已经 3 年多没有更新了,所以问题肯定会出现。

一个更现代的选择是 the modelsummary package(免责声明:我是维护者)。在我的偏见中,这个包更灵活和健壮,但是 YMMV.

下面我用 cross-references 粘贴了 Rmarkdown 文档的最小示例。有几点需要注意:

  • modelsummary 会自动检测输出格式,因此您只需在 Rmarkdown 文档最顶部的 YAML header 中指定 LaTeX 或 HTML。无需使用 modelsummaryoutput 参数(但无论如何都要查看文档!)。
  • table 标签由块的名称设置。在这里,它被称为“模型”,所以我们使用 tab:model 作为 cross-reference.
  • 您的 table 需要一个标题,否则 cross-references 将不会持续显示。
---
title: "modelsummary cross-reference test"
output: 
  bookdown::html_document2: default
---

```{r model}
library(modelsummary)

m1 <- lm(mpg ~ cyl + disp, mtcars)

modelsummary(m1, title = "A table title")
```

Table \@ref(tab:model) should show something on cars.

我自己找到了适用于 LaTeX 和 HTML 的解决方案。

---
title: "Ref Stargazer Test"
output: 
  bookdown::html_document2: default
---

Table \@ref(tab:mytable) is the referenced table.

```{r mytable, results='asis', fig.cap="This is my table."}
m1 <- lm(mpg ~ cyl + disp, mtcars)

# Use title caption from fig.cap
tit <- knitr::opts_current$get("fig.cap")

# Adding caption for html output
tit_html <- paste0('<span id="tab:',
                   knitr::opts_current$get("label"),
                   '">(#tab:',
                   knitr::opts_current$get("label"),
                   ')</span>',
                   tit)

stargazer::stargazer(m1,
                     label = paste0("tab:", knitr::opts_current$get("label")),
                     title = ifelse(knitr::is_latex_output(), tit, tit_html),
                     type = ifelse(knitr::is_latex_output(),"latex","html"),
                     header = F
                     )
```

您现在还可以在块 header 中使用 fig.cap 参数来为您的 table 编写您想要的标题。对于引用,您必须引用块标签(在本例中为“mytable”)。 stargazer 中的 title 参数创建了 <caption> 元素,这就是为什么要在此处插入 html 标题的原因。

解决此问题的一个简单方法是在 stargazer 上手动添加您的 table 的名字。

label = "tab:table4"

因此您的代码应如下所示:

stargazer(m1, label = "tab:mytable")

现在您可以像往常一样在 Rmarkdown 中进行交叉引用 \ref{tab:mytable}