Я собираюсь написать функцию, которая выводит как экранный вывод, так и 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")))
xtable
, но ответы на этот вопрос, который я задал некоторое время назад, может оказаться полезным. - person eipi10   schedule 22.09.2019huxtable
, но похоже, что есть средства для согласования с десятичной точкой. - person eipi10   schedule 22.09.2019library(huxtable); set_align(huxtable(regmat), value=".")
, но это не работает (возможно, из-за ячеек" --- "
). - person jay.sf   schedule 23.09.2019regmat2 <- trimws(regmat); regmat2 <- as_huxtable(regmat2); align(regmat2) <- ".";
, вы получите более приятный результат, но все же не идеальный, так как нет простого способа выравнивания по десятичным точкам ни в HTML, ни в TeX. Одним из обходных путей является установка шрифта"cmtt"
или другого шрифта фиксированной ширины. - person dash2   schedule 23.09.2019