Как установить ширину столбца и выравнивание текста в аргументе align xtable?

Я хотел бы сохранить ширину столбцов, которые я установил с помощью аргумента align xtable, и я хотел бы выровнять все числовые столбцы вправо, другие - влево, а заголовки - в центр.

Я нашел некоторые решения, используя таблицы, которые написаны непосредственно в файле rnw, но я хочу загрузить свои данные из файла, потому что моя таблица довольно большая и может измениться во время создания документа Knitr.

Код (в этом примере я использовал набор данных iris вместо собственных данных):

<<table_symbionts_chunk, results="asis", echo=FALSE>>=
    library(xtable)

        irisX <-print (xtable (iris,
                                     digits=rep(0,6),
                                     align= c("p{0.015\\textwidth}|", 
                                              "p{0.37\\textwidth}|", 
                                              "p{0.12\\textwidth}|", 
                                              "p{0.08\\textwidth}|", 
                                              "p{0.02\\textwidth}|", 
                                              "p{0.35\\textwidth}|")))
        @

person kamila    schedule 19.10.2015    source источник
comment
Пожалуйста, взгляните на этот ответ. Это отвечает на ваш вопрос?   -  person CL.    schedule 19.10.2015
comment
Спасибо. Я видел это, прежде чем я спросил здесь. Я думаю, что смогу использовать, если захочу записать таблицу непосредственно в файл .Rnw. Я понятия не имею, как использовать его с данными, импортированными из файла фрагментом кода...   -  person kamila    schedule 20.10.2015


Ответы (2)


Сложная часть этого вопроса относится к LaTeX. Обратите внимание, что мой код TeX основан на этих двух вопросах на tex.stackexchange:


На одну часть вопроса легко ответить: как установить фиксированную ширину столбца, но выровнять все числовые столбцы по правому краю, а все остальные — по левому?

Это вопрос только правильных типов столбцов (см. ответы, указанные выше). Решение может быть:

\documentclass{article}

\usepackage{array}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\\arraybackslash\hspace{0pt}}p{#1}}

\begin{document}
<<table_symbionts_chunk, results="asis", echo=FALSE>>=
library(xtable)

irisShort <- head(iris)
print(xtable(irisShort,
             digits=rep(0,6),
             align=c(
               "p{0.015\\textwidth}|",
               "R{0.37\\textwidth}|",
               "R{0.12\\textwidth}|",
               "R{0.08\\textwidth}|",
               "R{0.02\\textwidth}|",
               "p{0.35\\textwidth}|")))
@
\end{document}

Поскольку столбцы p{} по умолчанию выравниваются по левому краю, нам нужно определить только один новый тип столбца для столбцов с выравниванием по правому краю с фиксированной шириной: R.

Обратите внимание, что имена столбцов перекрываются, но это связано с шириной, указанной в вопросе.


Центрирование имен столбцов требует другого обоснования только для первой строки. Этого можно добиться с помощью команды \multicolumn. Однако, поскольку мы хотим добавить код LaTeX к именам столбцов, мы, кроме того, должны запретить xtable очищать имена столбцов с помощью sanitize.colnames.function = identity:

irisShort2 <- irisShort
colnames(irisShort2) <- paste("\\multicolumn{1}{c|}{", colnames(irisShort2), "}")

print(xtable(irisShort2,
             digits=rep(0,6),
             align=c(
               "p{0.015\\textwidth}|",
               "R{0.37\\textwidth}|",
               "R{0.12\\textwidth}|",
               "R{0.08\\textwidth}|",
               "R{0.02\\textwidth}|",
               "p{0.35\\textwidth}|")),
      sanitize.colnames.function = identity)

paste("\\multicolumn{1}{c|}{", colnames(irisShort2), "}") использует исходные имена столбцов, но заключает их в \multicolumn{1}{c|}{имя_столбца}, который предоставляет имена столбцов по центру.

Обратите внимание, что теперь имена столбцов больше не перекрываются (вместо этого таблица становится слишком широкой) из-за измененного типа столбца в первой строке.


Два фрагмента кода в этом ответе дают следующий результат: введите здесь описание изображения

person CL.    schedule 20.10.2015

У меня была та же проблема, и я хочу поделиться этой работой в консоли R, как

library(xtable)

irisShort <- head(iris)
print(xtable(irisShort,
             digits=rep(0,6),
             align=c(
               "p{1cm}|","p{3cm}|",
               "p{2cm}|","p{3cm}|",
               "p{3cm}|","p{3cm}|")))
person Seyma Kalay    schedule 29.04.2020