Как заставить xtable не игнорировать промежутки или выравнивать десятичные точки соответственно?

Я собираюсь написать функцию, которая выводит как экранный вывод, так и 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:

введите здесь описание изображения

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

В 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")))

person jay.sf    schedule 22.09.2019    source источник
comment
Я давно не использовал xtable, но ответы на этот вопрос, который я задал некоторое время назад, может оказаться полезным.   -  person eipi10    schedule 22.09.2019
comment
@ eipi10 На самом деле, я упомянул этот вопрос в своем вопросе. Это другая попытка, и когда вы присмотритесь, GOF на самом деле не выровнены.   -  person jay.sf    schedule 22.09.2019
comment
Ах, я пропустил это! Существует ряд более поздних пакетов, которые пытаются упростить создание таблиц с помощью R. Я не использовал huxtable, но похоже, что есть средства для согласования с десятичной точкой.   -  person eipi10    schedule 22.09.2019
comment
@eipi10 eipi10 Я пробовал library(huxtable); set_align(huxtable(regmat), value="."), но это не работает (возможно, из-за ячеек " --- ").   -  person jay.sf    schedule 23.09.2019
comment
@ jay.sf ваша проблема в том, что в вашей таблице уже много пробелов. huxtable пытается соблюдать их при выравнивании. Если вы сделаете regmat2 <- trimws(regmat); regmat2 <- as_huxtable(regmat2); align(regmat2) <- ".";, вы получите более приятный результат, но все же не идеальный, так как нет простого способа выравнивания по десятичным точкам ни в HTML, ни в TeX. Одним из обходных путей является установка шрифта "cmtt" или другого шрифта фиксированной ширины.   -  person dash2    schedule 23.09.2019