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

时间:2019-02-06 02:12:15

标签: r knitr blogdown

我正在使用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>

问题是,为什么kablelapply调用时的行为与外部行为不同?请注意,这两种行为与其简单地将文件编织为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网站

1 个答案:

答案 0 :(得分:0)

结果表明,责任方不是最后的lapply电话,而是HTML电话。 knitrblogdownbookdown的常规过程似乎是以(\#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调用中的表,该问题仍将受益。但就知道这解决了我的问题。如果出现更完整的解释,我会很乐意切换接受的答案