我正在使用Blogdown来创建一个具有一系列表格的博客文章。使用kable
函数创建单个表可以正常工作。如果你这样做
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')
```
将生成格式正确的表。该标题将显示为“ 表1:测试“如果您查看生成的站点的代码,则标题将如下所示。
<caption>
<span id="tab:test1">Table 1: </span>test
</caption>
理想情况下,我首先不想将表标记为Table 1
,但这是另一个问题。如果可以完全禁用kable字幕格式,我也很高兴。
但是,如果我改用lapply生成2个表
```{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
。如果您查看这些表格的标题,将会看到
<caption>(\#tab:test2)test2</caption>
问题是,为什么kable
从lapply
调用时的行为与外部行为不同?请注意,这两种行为与其简单地将文件编织为html_document
时的行为不同。
我深入研究了kable
的代码,发现标题链接是由knitr:::create_label
函数创建的。在研究此功能时,我看到了造成多个表错误行为的部分。
if (isTRUE(opts_knit$get("bookdown.internal.label"))) {
lab1 = "(\\#"
lab2 = ")"
}
我找不到代码来负责单个表的“正确”行为,但似乎knitr内部选项负责。
最终我想要的行为仅仅是
<caption>test</caption>
这是简单编织html文档时的行为。但是我还没有找到一种方法来设置相关的编织器选项,以及为什么它们在同一文档中有所不同。
编辑:进一步检查表明,该问题并非针对特定问题。可以使用for循环甚至{
自己复制它。可以从knitr的github页面上的this问题中获取有关所有有问题示例的完整帖子。 This github存储库包含复制该问题的基本Blogdown网站
答案 0 :(得分:0)
结果表明,责任方不是最后的lapply
电话,而是HTML
电话。 knitr
和blogdown
中bookdown
的常规过程似乎是以(\#tab:label)
的形式为表引用创建一个临时标记,并将其替换为适当的语法稍后在处理中。
我正在使用HTML调用,以便能够使用Shiny / htmltools中的tags
对象将表绑定在一起。由于我无法理解的原因,这种方法似乎使替换临时标记的过程变得不可能。出于我自己的目的,我能够同时删除所有临时标记,以消除格式错误的标题和按预期工作的表格编号
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
通过正确解释参考链接放置过程以及是否有可能将其应用于HTML
调用中的表,该问题仍将受益。但就知道这解决了我的问题。如果出现更完整的解释,我会很乐意切换接受的答案