kable создает некорректные ссылки в функции lapply в blogdown - PullRequest
0 голосов
/ 06 февраля 2019

Я использую blogdown для создания блога, в котором есть несколько таблиц.Создание одной таблицы с использованием функции kable работает нормально.Если вы сделаете

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

Новый файл rmd будет создан в каталоге content/post проекта.Если вы откроете этот файл и создадите одну таблицу, выполнив

```{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-документа.Но мне еще предстоит найти способ установить соответствующие параметры knitr и почему они различаются в одном документе.

Редактировать: Дальнейшее изучение показывает, что проблема не является специфической.Он может быть реплицирован с использованием цикла for или даже { сам по себе.Полный пост со всеми проблемными примерами можно найти в этом выпуске на странице gitub knitr. Это репозиторий github включает в себя базовый блог-сайт, который повторяет проблему

1 Ответ

0 голосов
/ 09 февраля 2019

Оказывается, ответственная сторона - это не звонок lapply, а звонок HTML в конце.Кажется, что обычный процесс knitr в blogdown и bookdown должен иметь временный маркер для ссылок на таблицы в виде (\#tab:label) и заменить его соответствующим синтаксисом позже в процессе обработки.

Я использовал HTML-вызов, чтобы иметь возможность использовать объект tags в глянцевом / htmltools для связывания таблиц вместе.Этот подход, кажется, делает процесс замены временного маркера невозможным по причинам, не зависящим от меня.Для своих собственных целей я смог убрать временный маркер вместе, чтобы избавиться от искаженных заголовков и номеров таблиц, работающих по назначению, выполнив

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.Но знаю, это решает мою проблему.Я с удовольствием переключу принятый ответ, если появится более полное объяснение

...