使用bookdown :: pdf_document2编织文档时遇到问题,使用标准pdf_document时不会出现。
具体来说,我使用compareGroups库和export2md函数输出比较表,如下所示:
当我使用output:pdf_document
时,这是成功的。但是,当我使用output: bookdown:pdf_document2
。
tex
文件中明显存在差异,我手动将表格从pdf_document输出的tex复制到pdf_document2。有没有人对如何正确创建表的书记有任何想法?我已经在此处创建了一个包含我的错误的回购,以获取更多详细信息:https://github.com/vitallish/bookdown-bug
答案 0 :(得分:1)
bookdown::pdf_document2()
与rmarkdwon::pdf_document()
不同,前者将$opts_knit$kable.force.latex
设置为TRUE
,后者则将其保留为默认值(FALSE
)。
.md
文件我认为从.md
到.tex
的过程应该相同,.tex
文件的差异可能是由于.md
文件的差异造成的。所以我运行以下代码来保存中间.md
文件。
rmarkdown::render('pdf_document.Rmd', clean = FALSE)
file.remove('pdf_document.utf8.md');
rmarkdown::render('pdf_document2.Rmd', clean = FALSE)
file.remove('pdf_document2.utf8.md');
pdf_document.knit.md
Table: Summary descriptives table by groups of `Sex'
Var Male N=1101 Female N=1193 p.overall
----------------------------------------------- --------------- ----------------- -----------
Recruitment year: 0.506
1995 206 (18.7%) 225 (18.9%)
2000 390 (35.4%) 396 (33.2%)
2005 505 (45.9%) 572 (47.9%)
Age 54.8 (11.1) 54.7 (11.0) 0.840
Smoking status: <0.001
Never smoker 301 (28.1%) 900 (77.5%)
Current or former < 1y 410 (38.3%) 183 (15.7%)
Former >= 1y 360 (33.6%) 79 (6.80%)
Systolic blood pressure 134 (18.9) 129 (21.2) <0.001
Diastolic blood pressure 81.7 (10.2) 77.8 (10.5) <0.001
pdf2_document.knit.md
\begin{table}
\caption{(\#tab:md-output)Summary descriptives table by groups of `Sex'}
\centering
\begin{tabular}[t]{l|c|c|c}
\hline
Var & Male N=1101 & Female N=1193 & p.overall\\
\hline
Recruitment year: & & & 0.506\\
\hline
\ \ \ \ 1995 & 206 (18.7\%) & 225 (18.9\%) & \\
\hline
\ \ \ \ 2000 & 390 (35.4\%) & 396 (33.2\%) & \\
\hline
\ \ \ \ 2005 & 505 (45.9\%) & 572 (47.9\%) & \\
\hline
Age & 54.8 (11.1) & 54.7 (11.0) & 0.840\\
\hline
Smoking status: & & & <0.001\\
\hline
\ \ \ \ Never smoker & 301 (28.1\%) & 900 (77.5\%) & \\
\hline
\ \ \ \ Current or former < 1y & 410 (38.3\%) & 183 (15.7\%) & \\
\hline
\ \ \ \ Former >= 1y & 360 (33.6\%) & 79 (6.80\%) & \\
\hline
Systolic blood pressure & 134 (18.9) & 129 (21.2) & <0.001\\
\hline
Diastolic blood pressure & 81.7 (10.2) & 77.8 (10.5) & <0.001\\
\hline
\end{tabular}
\end{table}
这解释了为什么你在pdf输出中看到不同的外观。
进一步探究原因,
> pdf1 <- rmarkdown::pdf_document()
> pdf2 <- bookdown::pdf_document2()
> all.equal(pdf, pdf2)
[1] "Length mismatch: comparison on first 11 components"
[2] "Component “knitr”: Component “opts_knit”: target is NULL, current is list"
[3] "Component “pandoc”: Component “args”: Lengths (8, 12) differ (string compare on first 8)"
[4] "Component “pandoc”: Component “args”: 8 string mismatches"
[5] "Component “pandoc”: Component “ext”: target is NULL, current is character"
[6] "Component “pre_processor”: target, current do not match when deparsed"
[7] "Component “post_processor”: target is NULL, current is function"
由于 knitr 将Rmarkdown转换为pandoc markdown,我猜$knitr
导致.md
个文件的差异。
> all.equal(pdf$knitr, pdf2$knitr)
[1] "Component “opts_knit”: target is NULL, current is list"
> pdf2$knitr$opts_knit
$bookdown.internal.label
[1] TRUE
$kable.force.latex
[1] TRUE
kable
是输出表的函数,因此$knitr$opts_knit$kable.force.latex
可能是根本原因。
测试我的假设,
pdf3 <- pdf2
pdf3$knitr$opts_knit$kable.force.latex = FALSE
rmarkdown::render('pdf_document3.Rmd', clean = FALSE, output_format = pdf3)
file.remove('pdf_document3.utf8.md')
pdf_document3.knit.md
Var Male N=1101 Female N=1193 p.overall
----------------------------------------------- --------------- ----------------- -----------
Recruitment year: 0.506
1995 206 (18.7%) 225 (18.9%)
2000 390 (35.4%) 396 (33.2%)
2005 505 (45.9%) 572 (47.9%)
Age 54.8 (11.1) 54.7 (11.0) 0.840
Smoking status: <0.001
Never smoker 301 (28.1%) 900 (77.5%)
Current or former < 1y 410 (38.3%) 183 (15.7%)
Former >= 1y 360 (33.6%) 79 (6.80%)
Systolic blood pressure 134 (18.9) 129 (21.2) <0.001
Diastolic blood pressure 81.7 (10.2) 77.8 (10.5) <0.001
哇哦!
实际上compareGroups::export2md
使用knitr::kable
作为工作马,
> compareGroups::export2md
function (x, which.table = "descr", nmax = TRUE, header.labels = c(),
caption = NULL, ...)
{
if (!inherits(x, "createTable"))
stop("x must be of class 'createTable'")
...
if (ww %in% c(1)) {
...
table1 <- table1[-1, , drop = FALSE]
return(knitr::kable(table1, align = align, row.names = FALSE,
caption = caption[1]))
}
if (ww %in% c(2)) {
table2 <- prepare(x, nmax = nmax, c())[[2]]
...
return(knitr::kable(table2, align = align, row.names = FALSE,
caption = caption[2]))
}
}
使用kable.force.latex
作为内部选项来调整其输出。如果您浏览 knitr 的GitHub存储库,您可以在R/utils.R
文件中找到以下代码
kable = function(
x, format, digits = getOption('digits'), row.names = NA, col.names = NA,
align, caption = NULL, format.args = list(), escape = TRUE, ...
) {
# determine the table format
if (missing(format) || is.null(format)) format = getOption('knitr.table.format')
if (is.null(format)) format = if (is.null(pandoc_to())) switch(
out_format() %n% 'markdown',
latex = 'latex', listings = 'latex', sweave = 'latex',
html = 'html', markdown = 'markdown', rst = 'rst',
stop('table format not implemented yet!')
) else if (isTRUE(opts_knit$get('kable.force.latex')) && is_latex_output()) {
# force LaTeX table because Pandoc's longtable may not work well with floats
# http://tex.stackexchange.com/q/276699/9128
'latex'
} else 'pandoc'
if (is.function(format)) format = format()
...
structure(res, format = format, class = 'knitr_kable')
}
$knitr$opts_knit$kable.force.latex = TRUE
导致bookdown::pdf_document2()
在.md
文件中插入乳胶代码,而rmarkdown::pdf_document()
会保留降价代码,这使pandoc有机会提供漂亮的表格。< / p>
我不认为这是一个错误。谢毅辉( bookdown 的作者)可能有一些特殊的理由这样做。 bookdown::pdf_document2()
永远不需要与rmarkdown::pdf_document()
相同。
答案 1 :(得分:1)
export2md 的此问题已在github上的最新版本的 compareGroups 软件包(4.0)中得到解决。您可以通过键入以下内容来安装此最新版本:
library(devtools)
devtools::install_github("isubirana/compareGroups")
我希望这个版本能尽快提交给CRAN。