呈现html时,knitr将(1)更改为<ol>?

时间:2018-12-04 15:49:11

标签: r r-markdown knitr kable

.Rmd文件的以下内容:

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

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

在呈现为html之后,将在<ol><li></li></ol>列中显示有序列表am,而不是括号中的数字(由sprintf产生)。

这是故意的吗?我该如何解决这个问题,并让括号内的数字显示在html输出中?

knitr::kable的输出似乎很好,显示:

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

详细信息:

  • 使用针织机1.20
  • RStudio服务器1.1.453
  • 请注意,删除format = "html"并不能解决问题,因为在现实环境中,我想使用CSS执行高级格式化,例如基于产生的表的类别

基于迈克尔·哈珀接受的答案的快速解决方法可能是这样的方法:

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 :(得分:4)

如果您不想删除format="html"参数,可以尝试使用HTML字符实体作为括号(&lpar&rpar),然后添加参数{{ 1}}:

escape = FALSE

enter image description here

尽管仍不能完全确定是什么导致了错误。括号的特定组合似乎被 knitr 奇怪地处理了。

答案 1 :(得分:3)

另一种解决方法是转义括号,例如

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

那么您将不需要escape = FALSE

请参见《 Pandoc手册》中的https://pandoc.org/MANUAL.html#backslash-escapes