【问题标题】:How to put a newline into a column header in an xtable in R如何在R中的xtable中将换行符放入列标题中
【发布时间】:2011-02-10 19:04:00
【问题描述】:

我有一个数据框,我正在使用 xtable 将其放入 sweave 文档中,但是我的一个列名很长,我想将它分成两行以节省空间

calqc_table<-structure(list(RUNID = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), ANALYTEINDEX = c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
1L, 1L), ID = structure(1:11, .Label = c("Cal A", "Cal B", "Cal C", 
"Cal D", "Cal E", "Cal F", "Cal G", "Cal H", "Cal High", "Cal Low", 
"Cal Mid"), class = "factor"), mean_conc = c(200.619459644855, 
158.264703128903, 102.469121407733, 50.3551544728544, 9.88296440865076, 
4.41727762501703, 2.53494715706024, 1.00602831741361, 199.065054555735, 
2.48063347296935, 50.1499780776199), sd_conc = c(2.3275711264554, 
NA, NA, NA, NA, NA, NA, 0.101636943231162, 0, 0, 0), nrow = c(3, 
1, 1, 1, 1, 1, 1, 3, 2, 2, 2)), .Names = c("Identifier of the Run within the Study", "ANALYTEINDEX", 
"ID", "mean_conc", "sd_conc", "nrow"), row.names = c(NA, -11L
), class = "data.frame")
calqc_xtable<-xtable(calqc_table)

我尝试在名称中添加换行符,但这似乎不起作用

names(calqc_table)[1]<-"Identifier of the \nRun within the Study"

有没有办法做到这一点?我看到有人建议使用 hmisc 包中的乳胶函数来手动遍历表格并手动将其写在乳胶中,包括换行符,但这似乎有点不靠谱!

【问题讨论】:

  • 这是一个完全有效的问题,适用于许多情况,但在这种特定情况下,我可能会探索减少冗长的方法——也许是“运行标识符”而不是“研究中运行的标识符”?
  • 你说得对,我想出了一个简短的例子,我的长标题比我平时的要冗长一些......

标签: r latex tex sweave xtable


【解决方案1】:

我发现这样做的最佳方法是将表格列指示为“固定宽度”列,以便其中的文本换行。使用xtable 包,可以这样做:

align( calqc_xtable ) <- c( 'l', 'p{1.5in}', rep('c',5) )

xtable 要求您为选项“行名”列提供对齐方式——这是最初的l 规范。部分规范p{1.5in} 用于您的第一个列标题,它很长。这将其限制为宽度为 1.5 英寸的框,并且标题将在必要时换成多行。其余五列使用c 说明符设置为居中。

p{1.5in} 这样的固定宽度列的一个主要问题是他们使用两端对齐来设置文本。这会导致每行中的字间距扩大,以使该行将填满分配的整个 1.5 英寸。

坦率地说,在大多数情况下,这会产生我无法用礼貌语言描述的结果(我是一个业余排版狂,这种行为会导致面部打勾)。

解决方法是通过在列规范前添加 &gt;{} 字段来提供乳胶对齐命令:

align( calqc_xtable ) <- c( 'l', '>{\\centering}p{1.5in}', rep('c',4) )

其他有用的对齐命令有:

  • \raggedright -> 使文本左对齐
  • \raggedleft -> 使文本右对齐

记得在 R 字符串中使用双反斜杠来转义它们。您可能还需要禁用xtable 默认使用的字符串清理功能。

注意

如果在表格的最后一列使用这种对齐技术将失败除非表格行以\tabularnewline而不是\\结尾,我认为这是xtable 的情况并非如此,并且无法通过任何用户可设置的选项轻松自定义。

要考虑的另一件事是,您可能不希望将整列换行到 1.5 英寸并居中 - 只是标题。在这种情况下,禁用 xtable 字符串清理并使用宽度为 1 的 \multicolumn 单元格设置标题:

names(calqc_table)[1]<-"\\multicolumn{1}{>{\\centering}p{1.5in}}{Identifier of the Run within the Study}"

【讨论】:

  • 有没有办法指定列的最大宽度?像 p{
  • 这可能是你必须要做的,但它是令人发指的。
【解决方案2】:

@Sharpie 的技术对我不起作用,因为 pandoc 在转换为 pdf 时出现错误 43 失败。因此,这就是我所做的:

移动了\\centering 标记:

names(calqc_table)=c(rep("\\multicolumn{1}{p{0.75in}}{\\centering Identifier of the Run within the Study}", 6))

(此处适用于表格的所有 6 列)

并禁用 xtable 打印中的清理:

print(calqc_table, sanitize.colnames.function=function(x){x})

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-14
    • 1970-01-01
    • 2023-02-11
    • 2019-11-28
    • 2014-10-07
    • 2015-09-10
    • 1970-01-01
    相关资源
    最近更新 更多