Как получить xtable, чтобы не игнорировать пробелы или выравнивать десятичные точки соответственно? - PullRequest
3 голосов
/ 22 сентября 2019

Я собираюсь написать функцию, которая выдает как вывод на экран, так и вывод на LaTeX / PDF списков таблиц регрессии и имеет проблемы с выравниванием десятичных точек последних.

Из этой игрушкитаблица regmat,

                1                 2                 3                 4                
(Intercept)     "      33.99 ***" "    3370.83 ***" "      39.42 ***" "      46.80 ***"
                "      (1.89)   " "    (260.49)   " "      (2.64)   " "      (6.37)   "
cyl             "       ---     " "       ---     " "      -1.51 ** " "       ---     "
                "       ---     " "       ---     " "      (0.42)   " "       ---     "
factor(am)1     "       ---     " "     180.92    " "       0.18    " "       0.19    "
                "       ---     " "    (139.63)   " "      (1.30)   " "      (1.49)   "
factor(cyl)6    "      -4.26 ** " "    -303.13 *  " "       ---     " "      -1.28    "
                "      (1.39)   " "    (140.73)   " "       ---     " "      (1.53)   "
factor(cyl)8    "      -6.07 ***" "    -216.37    " "       ---     " "      -1.39    "
                "      (1.65)   " "    (228.43)   " "       ---     " "      (2.16)   "
hp              "       ---     " "      -3.21 *  " "       ---     " "      -0.10 ** "
                "       ---     " "      (1.37)   " "       ---     " "      (0.03)   "
wt              "      -3.21 ***" "    -249.68 ** " "      -3.13 ** " "      -7.12 ** "
                "      (0.75)   " "     (88.56)   " "      (0.91)   " "      (2.24)   "
wt:hp           "       ---     " "       ---     " "       ---     " "       0.02 *  "
                "       ---     " "       ---     " "       ---     " "      (0.01)   "
Deviance        "    1126.05    " "11260471.88    " "    1126.05    " "    1126.05    "
Df              "      31       " "      31       " "      31       " "      31       "
Log-Likelihood  "     -73.31    " "    -217.60    " "     -73.99    " "     -67.34    "
AIC             "     156.62    " "     449.20    " "     157.99    " "     150.69    "
BIC             "     163.95    " "     459.46    " "     165.32    " "     162.41    "
Resid. deviance "     183.06    " " 1510255.92    " "     191.05    " "     126.07    "
Resid. Df       "      28       " "      26       " "      28       " "      25       "
Num. obs.       "      32       " "      32       " "      32       " "      32       "

Я получаю хороший вывод на экран с as.data.frame(regmat);

> as.data.frame(regmat)
                              1               2               3               4
(Intercept)           33.99 ***     3370.83 ***       39.42 ***       46.80 ***
                      (1.89)        (260.49)          (2.64)          (6.37)   
cyl                    ---             ---            -1.51 **         ---     
                       ---             ---            (0.42)           ---     
factor(am)1            ---           180.92            0.18            0.19    
                       ---          (139.63)          (1.30)          (1.49)   
factor(cyl)6          -4.26 **      -303.13 *          ---            -1.28    
                      (1.39)        (140.73)           ---            (1.53)   
factor(cyl)8          -6.07 ***     -216.37            ---            -1.39    
                      (1.65)        (228.43)           ---            (2.16)   
hp                     ---            -3.21 *          ---            -0.10 ** 
                       ---            (1.37)           ---            (0.03)   
wt                    -3.21 ***     -249.68 **        -3.13 **        -7.12 ** 
                      (0.75)         (88.56)          (0.91)          (2.24)   
wt:hp                  ---             ---             ---             0.02 *  
                       ---             ---             ---            (0.01)   
Deviance            1126.05     11260471.88         1126.05         1126.05    
Df                    31              31              31              31       
Log-Likelihood       -73.31         -217.60          -73.99          -67.34    
AIC                  156.62          449.20          157.99          150.69    
BIC                  163.95          459.46          165.32          162.41    
Resid. deviance      183.06      1510255.92          191.05          126.07    
Resid. Df             28              26              28              25       
Num. obs.             32              32              32              32       

все десятичные точки выровнены, даже в строках с круглыми скобками, а целые числа в нижнем разделе GOF заканчиваются перед точками.

Теперь я хочу аналогичный LaTeX/ PDF вывод с xtable с использованием rmarkdown и этим кодом,

library(xtable)
xtbl <- xtable(regmat, comment=FALSE)
align(xtbl) <- c("L{2.4cm}", rep(c("L{2cm}@{\\hskip 0.1cm}"), 4))
print(xtbl,
      tabular.environment="tabularx",
      width=".5\\textwidth",
      hline.after=c(-1, 0, 16, nrow(regmat)),
      comment=FALSE)

, где YAML выглядит следующим образом

---
output: 
  pdf_document:
    includes:
      in_header: "X:/<myDir>/header.tex"
classoption: 
- a4paper
- landscape
geometry: margin=2cm
header-includes: 
- \pagenumbering{gobble}
- \usepackage{dcolumn}
---

и header.tex - как предложено здесь - выглядит так,

\usepackage{array}
\usepackage{tabularx}
\newcolumntype{L}[1]{>{\raggedright\let\newline\\
\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{C}[1]{>{\centering\let\newline\\
\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{R}[1]{>{\raggedleft\let\newline\\
\arraybackslash\hspace{0pt}}m{#1}}
\newcolumntype{P}[1]{>{\raggedright\tabularxbackslash}p{#1}}

получение этого неудачного результата таблицы LaTeX / PDF :

enter image description here

Выглядит неплохо, но, как видно, выравнивание по левому краю начинается с первого непробельного символа, и все пробелы, похоже, игнорируются.

В rep(c("L{2cm}@{\\hskip 0.1cm}") я перепробовал все L, C, R и P из header.tex, но ни одно из них не выравнивает значения в десятичной точке, т.е.Кажется, я не использую пакет \usepackage{dcolumn}, который написан для выравнивания десятичных точек.

Меня не волнует dcolumn, но мне просто странно, что мои пробелы игнорируются.

Как я могу получить такое же выравнивание в моей LaTeX-PDF-таблице, как и на выводе экрана, показанном выше, либо с dcolumn, либо без игнорирования пробелов?

Данные

regmat <- structure(c("      33.99 ***", "      (1.89)   ", "       ---     ", 
"       ---     ", "       ---     ", "       ---     ", "      -4.26 ** ", 
"      (1.39)   ", "      -6.07 ***", "      (1.65)   ", "       ---     ", 
"       ---     ", "      -3.21 ***", "      (0.75)   ", "       ---     ", 
"       ---     ", "    1126.05    ", "      31       ", "     -73.31    ", 
"     156.62    ", "     163.95    ", "     183.06    ", "      28       ", 
"      32       ", "    3370.83 ***", "    (260.49)   ", "       ---     ", 
"       ---     ", "     180.92    ", "    (139.63)   ", "    -303.13 *  ", 
"    (140.73)   ", "    -216.37    ", "    (228.43)   ", "      -3.21 *  ", 
"      (1.37)   ", "    -249.68 ** ", "     (88.56)   ", "       ---     ", 
"       ---     ", "11260471.88    ", "      31       ", "    -217.60    ", 
"     449.20    ", "     459.46    ", " 1510255.92    ", "      26       ", 
"      32       ", "      39.42 ***", "      (2.64)   ", "      -1.51 ** ", 
"      (0.42)   ", "       0.18    ", "      (1.30)   ", "       ---     ", 
"       ---     ", "       ---     ", "       ---     ", "       ---     ", 
"       ---     ", "      -3.13 ** ", "      (0.91)   ", "       ---     ", 
"       ---     ", "    1126.05    ", "      31       ", "     -73.99    ", 
"     157.99    ", "     165.32    ", "     191.05    ", "      28       ", 
"      32       ", "      46.80 ***", "      (6.37)   ", "       ---     ", 
"       ---     ", "       0.19    ", "      (1.49)   ", "      -1.28    ", 
"      (1.53)   ", "      -1.39    ", "      (2.16)   ", "      -0.10 ** ", 
"      (0.03)   ", "      -7.12 ** ", "      (2.24)   ", "       0.02 *  ", 
"      (0.01)   ", "    1126.05    ", "      31       ", "     -67.34    ", 
"     150.69    ", "     162.41    ", "     126.07    ", "      25       ", 
"      32       "), .Dim = c(24L, 4L), .Dimnames = list(c("(Intercept)", 
" ", "cyl", "   ", "factor(am)1", "     ", "factor(cyl)6", "       ", 
"factor(cyl)8", "         ", "hp", "           ", "wt", "             ", 
"wt:hp", "               ", "Deviance", "Df", "Log-Likelihood", 
"AIC", "BIC", "Resid. deviance", "Resid. Df", "Num. obs."), c("1", 
"2", "3", "4")))
...