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>
问题是,为什么 kable
从 lapply
调用时的行为与其在外部的行为不同?请注意,这两种行为都不同于将文件编织为 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
电话。 knitr
在 blogdown
和 bookdown
中的常规过程似乎是以 (\#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。但是知道这解决了我的问题。如果出现更完整的解释,我很乐意切换已接受的答案
我正在使用 blogdown 创建一个包含一系列 table 的博客post。使用 kable
函数创建单个 table 效果很好。如果你这样做
blogdown::new_site()
blogdown::new_post("test", ext = ".rmd")
将在项目的 content/post
目录中创建一个新的 rmd 文件。如果您打开该文件并通过
```{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>
问题是,为什么 kable
从 lapply
调用时的行为与其在外部的行为不同?请注意,这两种行为都不同于将文件编织为 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
电话。 knitr
在 blogdown
和 bookdown
中的常规过程似乎是以 (\#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。但是知道这解决了我的问题。如果出现更完整的解释,我很乐意切换已接受的答案