【问题标题】:Print HTML or Word table in knitr so that whitespaces in strings are respected在 knitr 中打印 HTML 或 Word 表格,以便尊重字符串中的空格
【发布时间】:2015-10-04 11:28:42
【问题描述】:

使用 knitr 和 Rstudio,我正在尝试将数据帧打印到 HTML 或 Word,以便 versicolor 中的前导空格将 versicolor 推到右侧。

#data
library(knitr ) 
library(xtable)

df <- iris[c(1,51),c(5,1)]
df$Species  <- as.character(df$Species)
df$Species[ df$Species=="versicolor"]  <- "         versicolor"

尝试不同的 kable() 组合...

#table
kable(  df)
kable(  df, right = FALSE,align = c("l", "l" ) )
kable(  df, right = FALSE,align = c("r", "l" ) )

我明白了:

...或者这个:

但我试图得到这个:

【问题讨论】:

  • 在 kable 函数中,您将看到 x = gsub("^\\s*|\\s*$", "", x) 行,我认为这就是它删除所有前导和尾随空格的原因。可以修改代码,自定义kable函数。
  • 您可以使用Pandoc's markdown 对齐列,但不能对齐唯一单元格。
  • @zx8754 即使我不修剪空格,它们也不会显示在表格中,因为前导/尾随空格在 Markdown 表中没有特殊含义,将被忽略。即使它们在 Markdown 中没有被忽略,它们在 HTML 中仍然会默认被忽略(连续的空格将被视为一个空格)。所以我认为下面莎朗的解决方案应该是正确的。

标签: r whitespace rstudio knitr xtable


【解决方案1】:

使用 kableExtra 包怎么样?请参阅此处的“行缩进”:

https://cran.r-project.org/web/packages/kableExtra/vignettes/awesome_table_in_html.html

基本上,

library(kableExtra)
dt <- mtcars[1:5, 1:6]
kable(dt) %>%
  kable_styling("striped", full_width = F) %>%
  add_indent(c(1, 3, 5))

【讨论】:

    【解决方案2】:

    用一个gsub 将前导空格与尾随文本分开。然后,用第二个gsub 全局替换这些空格。最后,将这两部分与paste结合起来。

    作为单行:

    paste0(gsub('\\s', '&nbsp;', gsub('^(\\s*)\\S.*', '\\1', df$Species)), gsub('^\\s*(\\S.*)', '\\1', df$Species))
    

    如果df$Species &lt;- " versicolor",则结果为:"&amp;nbsp;&amp;nbsp;&amp;nbsp;versicolor"

    如果df$Species &lt;- " one two three",则结果为:"&amp;nbsp;&amp;nbsp;&amp;nbsp;one two three"

    或者,为了清晰起见重新格式化:

    x <- df$Species
    
    paste0(                                 # Combine edited text
        gsub('\\s', '&nbsp;',               # Replace leading spaces
            gsub('^(\\s*)\\S.*', '\\1', x)  # Extract leading spaces
        ), 
        gsub('^\\s*(\\S.*)', '\\1', x)      # Extract trailing text
    )
    

    【讨论】:

      【解决方案3】:

      你可以试试添加

      df$Species <- gsub(" ", "&nbsp;", df$Species, fixed=TRUE)
      

      在创建表格之前,这会将 versicolor 之前的所有空格更改为 HTML 不间断空格。

      【讨论】:

      • 这会将 all 空格更改为 &amp;nbsp;,而不仅仅是前导(需要前瞻正则表达式)。不间断空格会影响行尾的换行符。它不会填充。
      • 不确定物种名称中的所有空格是否有问题,以便在只有   的表格中显示如果它不是您进行搜索/排序的交互式表格?
      【解决方案4】:

      如果您愿意使用一些 HTML:

      df$Species[ df$Species=="versicolor"]  <- 
        "<code style='background:white'>         </code>versicolor"` will get you something like you want
      

      df$Species[ df$Species=="versicolor"]  <- 
        "<span style='padding-left:30px'>         versicolor</span>"
      

      将为您提供left-space-padding。

      后者甚至可能以编程方式更简洁(在padding-left 中插入# 的倍数。

      【讨论】:

        猜你喜欢
        • 2022-10-02
        • 2020-06-14
        • 2020-07-23
        • 1970-01-01
        • 1970-01-01
        • 2017-04-09
        • 2020-08-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多