Обрезка дополнительной горизонтальной линейки в таблицах LaTeX из xtable R

В: Как я могу обрезать дополнительную длину горизонтальной линейки в таблицах LaTeX из xtable R?

Я хотел бы сделать что-то вроде того, что вы видите в моем коде R ниже. Но этот код выдает и выдает ошибку, не давая желаемого результата.

% table 1
    \begin{table}[ht]
      \centering
      \begin{tabular}{@{}lrr@{}}
        \toprule  
        & a\_a & b\_b \\ 
        \midrule 
        A & 0.35 & -1.05 \\ 
        B & 0.64 & 0.92 \\ 
        \bottomrule 
      \end{tabular}
    \end{table}

% table 2 
    \begin{table}[ht]
      \centering
      \begin{tabular}{lrr}
        \toprule  
        & a\_a & b\_b \\ 
        \midrule 
        A & 0.36 & -1.05 \\ 
        B & 0.64 & 0.92 \\ 
        \bottomrule 
      \end{tabular}
    \end{table}

столы

# Begin R code
library(xtable)
library(stringr)
options(xtable.comment = FALSE)
set.seed(10)
mat <- matrix(rnorm(4), nrow=2)
rownames(mat) <- LETTERS[1:2]
colnames(mat) <- str_c(letters[1:2], "_", letters[1:2])
#mat.x <- xtable(mat, caption="My Caption!", align="lrr", digits=2) # No Error!
mat.x <- xtable(mat, align="@{}lrr@{}", digits=2) # Error!
print(mat.x, 
      sanitize.text.function = function(x){x},
      sanitize.colnames.function = function(x){str_replace_all(x, "_", "\\\\_")},
      floating=T,
      hline.after=NULL,
      math.style.negative=F,
      add.to.row=list(pos=list(-1,0,nrow(mat.x)),
                      command=c("\\toprule ", "\\midrule ", "\\bottomrule ")))

# Error in `align<-.xtable`(`*tmp*`, value = "@{}lrr@{}") : 
#  "align" must have length equal to 3 ( ncol(x) + 1 )
# In addition: Warning message:
#  In .alignStringToVector(value) : Nonstandard alignments in align string

person lowndrul    schedule 01.11.2016    source источник
comment
не уверен, чего ты хочешь, но возьми маленькую плоскодонку xtable(mat, align=c("@{}l", "r", "r@{}"), digits=2)   -  person user20650    schedule 01.11.2016
comment
Успешно справился. Хотел бы я подумать об этом. Никогда не видел фактического вектора символов, переданного аргументу align. Оно работает!   -  person lowndrul    schedule 01.11.2016


Ответы (1)


Вам нужно передать либо строку с тем же количеством символов, что и количество столбцов + 1, либо строку такой длины. Так что попробуйте (среди других перестановок)

align=c("@{}l", "r", "r@{}")

Чтобы понять, почему, взгляните на functions.

library(xtable)

set.seed(10)
mat <- matrix(rnorm(4), nrow=2)
rownames(mat) <- LETTERS[1:2]
colnames(mat) <- paste0(letters[1:2], "_", letters[1:2])
xtable(mat, align="@{}lrr@{}", digits=2) 

«выравнивание» должно иметь длину, равную 3 ( ncol(x) + 1 )

Предупреждение предлагает передать вектор длины три, поэтому попробуйте

xtable(mat, align=c("@{}l","r", "r@{}"), digits=2)
# \begin{table}[ht]
# \centering
# \begin{tabular}{@{}lrr@{}}
# ---
# ---

Так что это работает так, как ожидалось. Также аргумент align устойчив к тому, как вы передаете строку, если она имеет требуемую длину.

xtable(mat, align=c("@{}lrr@", "{", "}"), digits=2)
# \begin{table}[ht]
# \centering
# \begin{tabular}{@{}lrr@{}}
# ---
# ---

Чтобы понять, почему первая строка не сработала, посмотрите на соответствующие части функции xtable:::xtable.data.frame: должна быть связана с align

align(x) <- switch(1 + is.null(align), align, c("r", c("r", "l")[(characters | factors) + 1]))

Это приводит к xtable:::`align<-.xtable, а затем к xtable:::.alignStringToVector

person user20650    schedule 01.11.2016