【问题标题】:xtable for conditional cell formatting not with special charactersxtable 用于不带特殊字符的条件单元格格式
【发布时间】:2018-05-20 02:40:14
【问题描述】:

我将xtable for conditional cell formatting significant p-values of table 的解决方案应用于我的数据集;但是,我不能按照建议的答案使用 sanitize.text.function = function(x) x

示例

数据集

数据集包含使用 _ 字符的文本列,如下例所示:

dta <- data.frame(
    varA = c("this_and_that", "something_else", "def"),
    varB = c("other_thing", "something_different", "abc")
)

xtable

当使用语法传递给时:

print.xtable(x = xtable(dta), 
             booktabs = TRUE,
             comment = FALSE,
             floating = TRUE,
             type = "latex",
             include.rownames = FALSE,
             NA.string = "NA",
             # Font and linespace size
             size = "\\fontsize{5pt}{5pt}\\selectfont")

代码生成可用的latex sn-p:

\begin{table}[ht]
\centering
\begingroup\fontsize{5pt}{5pt}\selectfont
\begin{tabular}{ll}
  \toprule
varA & varB \\ 
  \midrule
this\_and\_that & other\_thing \\ 
  something\_else & something\_different \\ 
  def & abc \\ 
   \bottomrule
\end{tabular}
\endgroup
\end{table}

问题

我想将 \textbf{} 应用于包含 something 字样的列。按照链接问题中讨论的答案,这可以通过ifelsesanitize.text.function = function(x) x 完成,如下例所示:

print.xtable(
    x = xtable(dta %>%
                   mutate_all(funs(
                       ifelse(grepl("something", .), paste0("\\textbf{", ., "}"), .)
                   ))),
    booktabs = TRUE,
    comment = FALSE,
    floating = TRUE,
    type = "latex",
    include.rownames = FALSE,
    NA.string = "NA",
    # Font and linespace size
    size = "\\fontsize{5pt}{5pt}\\selectfont",
    sanitize.text.function = function(x) {
        x
    }
)

这将生成关于 \\textbf{} 的正确语法,但 _ 不会因为:sanitize.text.function = function(x) {x} 而转义。

\begin{table}[ht]
\centering
\begingroup\fontsize{5pt}{5pt}\selectfont
\begin{tabular}{ll}
  \toprule
varA & varB \\ 
  \midrule
this_and_that & other_thing \\ 
  \textbf{something_else} & \textbf{something_different} \\ 
  def & abc \\ 
   \bottomrule
\end{tabular}
\endgroup
\end{table}

删除sanitize.text.function

代码:

print.xtable(
    x = xtable(dta %>%
                   mutate_all(funs(
                       ifelse(grepl("something", .), paste0("\\textbf{", ., "}"), .)
                   ))),
    booktabs = TRUE,
    comment = FALSE,
    floating = TRUE,
    type = "latex",
    include.rownames = FALSE,
    NA.string = "NA",
    # Font and linespace size
    size = "\\fontsize{5pt}{5pt}\\selectfont"
)

将产生可怕的混乱,因为默认清理行为将试图逃避\\textbf

\begin{table}[ht]
\centering
\begingroup\fontsize{5pt}{5pt}\selectfont
\begin{tabular}{ll}
  \toprule
varA & varB \\ 
  \midrule
this\_and\_that & other\_thing \\ 
  $\backslash$textbf\{something\_else\} & $\backslash$textbf\{something\_different\} \\ 
  def & abc \\ 
   \bottomrule
\end{tabular}
\endgroup
\end{table}

替代方法/侧点

可能更好的方法是使用 sanitize 功能:

print.xtable(
    x = xtable(dta),
    booktabs = TRUE,
    comment = FALSE,
    floating = TRUE,
    type = "latex",
    include.rownames = FALSE,
    NA.string = "NA",
    # Font and linespace size
    size = "\\fontsize{5pt}{5pt}\\selectfont",
    sanitize.text.function = function(x) {
        ifelse(grepl("something", x), paste0("\\textbf{", x, "}"), x)
    }
)

总结

除了 grep 表中的所有特殊字符并通过处理 both 元素的自定义清理函数手动转义它们之外,还有其他方法可以解决这个问题textbf{} _ 对吗?


工作解决方案

使用:

  sanitize.text.function = function(x) {
    gsub(fixed = TRUE, pattern = "_", replacement = "\\_", 
         x = ifelse(grepl(pattern = "something", x = x), paste0("\\textbf{", x, "}"), x)
         )
  }

可以手动转义_,理想情况下我想找到一个解决方案,我不必手动转义每个字符。

【问题讨论】:

    标签: xtable r latex knitr xtable rnw


    【解决方案1】:

    Hmisc 中有一个函数可以完成工作:latexTranslate。先运行它,然后应用 LATEX 格式命令。

    library("Hmisc")
    library("xtable")
    dta <- data.frame(
        varA = c("this_and_that", "something_else", "def"),
        varB = c("other_thing", "something_different", "abc")
    )
    print.xtable(
        x = xtable(dta),
        file=paste0(getwd(),"/table/sanitize_test.tex"),
        booktabs = TRUE,
        comment = FALSE,
        floating = TRUE,
        type = "latex",
        include.rownames = FALSE,
        NA.string = "NA",
        # Font and linespace size
        size = "\\fontsize{5pt}{5pt}\\selectfont",
        sanitize.text.function = function(x) {
          x <- latexTranslate(x)
          x <- ifelse(grepl("something", x), paste0("\\textbf{", x, "}"), x)
          return(x)
        }
    )   
    

    【讨论】:

      猜你喜欢
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多