Как поместить новую строку в заголовок столбца в xtable в R - PullRequest
17 голосов
/ 22 апреля 2010

У меня есть фрейм данных, который я помещаю в документ sweave , используя xtable, однако одно из имен моих столбцов довольно длинное, и я хотел бы разбить его на две строки, чтобы сэкономить место

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"

Есть ли способ сделать это?Я видел, как кто-то предлагал использовать функцию latex из пакета hmisc для ручной итерации по таблице и записи ее в латекс вручную, включая символ новой строки, но это похоже на ошибку!

Ответы [ 2 ]

26 голосов
/ 22 апреля 2010

Лучший способ сделать это - указать столбец таблицы в виде столбца с «фиксированной шириной», чтобы текст внутри него был перенесен. С пакетом 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 дюйма.

Честно говоря, в большинстве случаев это приводит к результатам, которые я не могу описать, используя вежливый язык (я любитель типографии, и такое поведение вызывает лицевые клещи).

Исправление состоит в том, чтобы предоставить команду выравнивания латекса, добавив поле >{} к спецификации столбца:

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

Другие полезные команды выравнивания:

  • \ raggedright -> делает текст выровненным по левому краю
  • \ raggedleft -> заставляет текст быть выровненным по правому краю

Не забудьте удвоить обратную косую черту, чтобы избежать их в строках R. Вам также может потребоваться отключить функцию очистки строк, которую xtable использует по умолчанию.

Примечание

Этот метод выравнивания завершится с ошибкой , если используется в последнем столбце таблицы , если * * * * * * строки строк не заканчиваются \tabularnewline вместо \\, что, на мой взгляд, не является случай с xtable и не легко настраивается с помощью любой настраиваемой пользователем опции.

Еще одна вещь, которую следует учитывать, это то, что вы можете не захотеть, чтобы весь столбец был перенесен на 1,5 дюйма и центрирован - только заголовок. В этом случае отключите xtable очистку строк и установите заголовок, используя ячейку \multicolumn шириной 1:

names(calqc_table)[1]<-"\\multicolumn{1}{>{\\centering}p{1.5in}}{Identifier of the Run within the Study}"
2 голосов
/ 27 мая 2015

@ Техника Шарпи у меня не сработала, так как pandoc потерпел неудачу с ошибкой 43 при преобразовании в pdf. Поэтому вот что я сделал:

переместил маркер \\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})
...