knitr меняет (1) на <ol>при рендеринге html? - PullRequest
0 голосов
/ 04 декабря 2018

Следующее содержимое файла .Rmd:

---
title: "Untitled"
output:
  html_document: default
---

```{r cars}
mtcars$am <- sprintf("(%s)", as.character(mtcars$am))
knitr::kable(mtcars, format = "html")
```

Показывает упорядоченные списки <ol><li></li></ol> в столбце am вместо чисел в скобках (как произведено с sprintf)после рендеринга в html.

Это предназначено?Как я могу обойти это, и чтобы числа в скобках отображались в виде вывода html?

Вывод knitr::kable выглядит нормально, показывая:

<td style="text-align:left;"> (1) </td>

Подробности:

  • Использование knitr 1.20
  • RStudio Server 1.1.453
  • обратите внимание, что удаление format = "html" не решает проблему, как в реальном контексте, я хотел бы сделать расширенное форматирование с CSS, например, на основе классов произведенныхтаблицы

A быстрое решение проблемы , основанное на принятом ответе Майкла Харпера, может быть следующим методом:

replacechars <- function(x) UseMethod("replacechars")
replacechars.default <- function(x) x
replacechars.character <- function(x) {
  x <- gsub("(", "&lpar;", x, fixed = TRUE)
  x <- gsub(")", "&rpar;", x, fixed = TRUE)
  x
}
replacechars.factor <- function(x) {
  levels(x) <- replacechars(levels(x))
  x
}
replacechars.data.frame <- function(x) {
  dfnames <- names(x)
  x <- data.frame(lapply(x, replacechars), stringsAsFactors = FALSE)
  names(x) <- dfnames
  x
}

Пример использования:

mtcars <- datasets::mtcars

# Create a character with issues
mtcars$am <- sprintf("(%s)", as.character(mtcars$am))

# Create a factor with issues
mtcars$hp <- as.factor(mtcars$hp)
levels(mtcars$hp) <- sprintf("(%s)", levels(mtcars$hp))

replacechars(mtcars)

Ответы [ 2 ]

0 голосов
/ 08 марта 2019

Альтернативным решением является исключение скобок, например,

mtcars$am <- sprintf("\\(%s)", as.character(mtcars$am))

Тогда вам не понадобится escape = FALSE.

См. https://pandoc.org/MANUAL.html#backslash-escapes в Руководстве Пандока.

0 голосов
/ 04 декабря 2018

Если вы не хотите удалять аргумент format="html", вы можете попробовать использовать символьные объекты HTML для круглых скобок (&lpar и &rpar), а затем добавить аргумент escape = FALSE:

```{r cars}
mtcars$am <- sprintf("&lpar;%s&rpar;", as.character(mtcars$am))
knitr::kable(mtcars, format = "html", escape = FALSE)
```

enter image description here

Все еще не до конца уверен в том, что является причиной ошибки.Кажется, что специфическая комбинация скобок странным образом обрабатывается knitr .

...