#html #r #knitr #special-characters #kable
#HTML #r #knitr #специальные символы #kable
Вопрос:
С $-знаками в данных knitr::kable происходит путаница. Данные отображаются так, как если бы они должны были быть в математическом режиме. Как ни странно, knitr в PDF не показывает этого эффекта.
Я пытался экранировать знак доллара обратной косой чертой (даже пытался использовать до четырех обратных косых черт), использовать опцию «разметка» для результатов, отключить автоматическое экранирование в kable или использовать шестнадцатеричный юникод вместо символа. Ничего не помогло. Любые дальнейшие идеи приветствуются.
Я использую Rstudio для преобразования либо в HTML, либо в PDF. Вот мой MWE из my *.Rmd:
---
title: MWE knitr::kable does not escape special character $ correctly in the string data when knitring to html (to PDF is okay)
output:
html_document:
df_print: paged
pdf_document: default
---
```{r UNESCAPED , eval=TRUE , echo=FALSE , tidy=TRUE, message=FALSE , warning=FALSE , results='asis'}
library ("knitr")
library("kableExtra")#not needed but helpful to see the problem
library("tidyverse")#not needed but helpful to see the problem
data <- data.frame(stringVar=c("$1$","$2$"))
#escaping $ shows error message:
#data <- data.frame(stringVar=c("$1$","$2$"))
if (knitr::is_html_output())
{
knitr::kable(data, row.names = TRUE, format = "html" , escape = TRUE)%>% #same effect with escape=FALSE
kable_styling( "striped")#same effect without kable_styling
#last cell is rendered in math mode
}else{
knitr::kable(data, format="latex", longtable=T, booktabs = T, linesep = "", row.names = TRUE, escape = TRUE) %>%
kable_styling(latex_options =c("striped"))
#last cell is rendered as expected
}#end of if
```
Комментарии:
1. При использовании для экранирования: вам понадобится один, чтобы экранировать знак доллара, а затем второй, чтобы экранировать первую обратную косую черту. Использование
data <- data.frame(stringVar=c("\$1\$","\$2\$"))
, похоже, работает для таблицы HTML.2. Да, вы правы. Извините, я запутался с количеством обратных косых черт при замене. Решение пользователя 12728748 простое.
Ответ №1:
Я могу заставить это работать, используя обратные метки:
Редактировать:
@aosmith прав — двойной escape — лучший ответ, поскольку он не отображает его с затенением фона
---
title: MWE knitr::kable does not escape special character $ correctly in the string data when knitring to html (to PDF is okay)
output:
html_document:
df_print: paged
pdf_document: default
---
```{r UNESCAPED , eval=TRUE , echo=FALSE , tidy=TRUE, message=FALSE , warning=FALSE , results='asis'}
library ("knitr")
library("kableExtra")#not needed but helpful to see the problem
library("tidyverse")#not needed but helpful to see the problem
data <- data.frame(stringVar=c("$1$","$2$"))
if (knitr::is_html_output())
{
# data %>% mutate_all( stringr::str_replace_all, pattern=fixed("$"), replacement="`$`") %>%
data %>% mutate_all( stringr::str_replace_all, pattern=fixed("$"), replacement="\$") %>%
knitr::kable( row.names = TRUE, format = "html" , escape = FALSE) %>% #same effect with escape=FALSE
kable_styling( "striped")#same effect without kable_styling
#last cell is rendered in math mode
}else{
knitr::kable(data, format="latex", longtable=T, booktabs = T, linesep = "", row.names = TRUE, escape = TRUE) %>%
kable_styling(latex_options =c("striped"))
#last cell is rendered as expected
}#end of if
```
Комментарии:
1. Спасибо, я запутался с количеством обратных косых черт. Ваш код очень понятен. То, что я пробовал, было: gsub(pattern =»\ $», замена=»\\\$», x=data$StringVar) (Но тогда я использовал неправильное количество обратных символов.)