knitr::kable неправильно экранирует специальный символ $ в строковых данных при преобразовании в html (в PDF — это нормально)

#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) (Но тогда я использовал неправильное количество обратных символов.)