kable 在 blogdown 的 lapply 函数中生成格式错误的参考链接

kable produces malformed reference links within lapply function in blogdown

我正在使用 blogdown 创建一个包含一系列 table 的博客post。使用 kable 函数创建单个 table 效果很好。如果你这样做

blogdown::new_site()
blogdown::new_post("test", ext = ".rmd")

将在项目的 content/post 目录中创建一个新的 rmd 文件。如果您打开该文件并通过

创建一个 table
```{r test1}
library(knitr)
library(magrittr)
library(shiny)

data.frame(a= c(1,2,3)) %>% kable(caption = 'test',format = 'html')

```

将生成格式正确的 table。标题将显示为“ Table 1: test" 如果您查看生成站点的代码,标题将如下所示。

<caption>
<span id="tab:test1">Table 1: </span>test
</caption>

理想情况下,我首先不想将 table 标记为 Table 1,但这是另一个问题。如果 kable 的字幕格式可以完全禁用,我也会很高兴。

但是,如果我使用 lapply 生成 2 个 table,而不是

```{r test2}

lapply(1:2,function(x){
    data.frame(a= c(1,2,3)) %>% kable(caption = 'test2',format = 'html') %>% HTML()
}) -> tables

tables[[1]]

tables[[2]]

```

字幕的前缀为 \#tab:test2。如果您查看这些 table 的标题,您会看到

<caption>(\#tab:test2)test2</caption>

问题是,为什么 kablelapply 调用时的行为与其在外部的行为不同?请注意,这两种行为都不同于将文件编织为 html_document.

时的行为。

我深入研究了 kable 的代码,发现标题 link 是由 knitr:::create_label 函数创建的。查看此函数,我看到了对多个 tables.

中的错误行为负责的部分
if (isTRUE(opts_knit$get("bookdown.internal.label"))) {
    lab1 = "(\#"
    lab2 = ")"
}

我找不到代码,负责单个 table 的 "correct" 行为,但似乎 knitr 内部选项负责。

最终我想要的行为就是

<caption>test</caption>

这是简单编织 html 文档时的行为。但我还没有找到一种方法来设置相关的 knitr 选项以及为什么它们在同一文档中不同。

编辑:进一步检查表明该问题不是 lapply 具体的。它可以使用 for 循环甚至 { 本身进行复制。可以从 this issue on knitr's github page. This github 存储库中获取包含所有问题示例的完整 post,包括复制问题的基本 blogdown 站点

原来责任方不是lapply电话,而是最后的HTML电话。 knitrblogdownbookdown 中的常规过程似乎是以 (\#tab:label) 的形式为 table 引用设置一个临时标记并替换它在稍后的处理中使用适当的语法。

我使用 HTML 调用能够使用 shiny/htmltools 中的 tags 对象将 table 绑定在一起。由于我无法理解的原因,这种方法似乎使更换临时标记的过程变得不可能。为了我自己的目的,我能够通过

remove_table_numbers = function(table){
  old_attributes = attributes(table)
  table %<>% as.character() %>% gsub("\(\\#tab:.*?\)","",.)
  attributes(table) = old_attributes
  return(table)
}

data.frame(a= c(1,2,3)) %>% kable(caption = 'test',format = 'html') %>% remove_table_numbers

这个问题仍然会受益于对参考 link 放置过程的正确解释,如果可以将其应用于 HTML 调用中的 tables。但是知道这解决了我的问题。如果出现更完整的解释,我很乐意切换已接受的答案