为什么从rmarkdown渲染pdf需要在渲染之间关闭rstudio?
背景
我正在尝试使用render()
渲染一个rmarkdown文档。 render
调用有两个参数化元素:
output_format()
。 kableExtra
包)是乳胶还是html。 这是名为test.Rmd的rmarkdown文件
---
title: "Title"
author: "Zzz Zzzzzz"
params:
table_format:
value
---
```{r setup}
knitr::opts_chunk$set(echo = FALSE)
library(knitr)
library(kableExtra)
options(knitr.table.format = params$table_format)
```
## Test table
```{r cars}
if (params$table_format == "latex"){
kable(iris[1:100,], booktabs = T) %>%
kable_styling(latex_options = c("scale_down"))
}
if (params$table_format == "html"){
kable(iris[1:100,]) %>%
kable_styling(bootstrap_options = c("striped", "hover")) %>%
scroll_box(width = "500px", height = "600px")
}
params$table_format
```
现在,这里有两个调用来渲染文件:
rmarkdown::render("test.Rmd", output_format = "pdf_document", params = list(
table_format = "latex"
))
rmarkdown::render("test.Rmd", output_format = "html_document", params = list(
table_format = "html"
))
问题
现在,如果我打开一个新的rstudio会话,我可以运行这两个render
调用没有问题。 .pdf或.html文件被创建。 但是,如果我然后尝试再次运行.pdf渲染,我得到以下错误:
“C:/ Program Files / RStudio / bin / pandoc / pandoc”+ RTS -K512m -RTS test.utf8.md --to latex --from markdown + autolink_bare_uris + ascii_identifiers + tex_math_single_backslash --output test.pdf --template“ C: Users salbers R win-library 3.4 rmarkdown rmd latex default-1.17.0.2.tex“ - highlight-style tango --latex-engine pdflatex --variable graphics = yes --variable “几何:边距= 1英寸”! 未定义的控制顺序。 begin {tabular} {rrrrl} toprule Sepal.Length&Sepal.Width&Pet ... l.267 end {tabular}}
pandoc.exe:生成PDF错误错误:pandoc文档转换失败,错误43此外:警告消息:运行命令'“C:/ Program Files / RStudio / bin / pandoc / pandoc”+ RTS -K512m -RTS test.utf8。 md --to latex - from markdown + autolink_bare_uris + ascii_identifiers + tex_math_single_backslash --output test.pdf --template“C: Users salbers R win-library 3.4 rmarkdown rmd latex default-1.17。 0.2.tex“ - 高光风格的探戈-latex-engine pdflatex - 变量图形= yes - 变量”geometry:margin = 1in“'的状态为43
html渲染一次又一次地正常工作。 如果我关闭rstudio,然后运行该项目,PDF的渲染也很好。
题
嗯,让我先发布解决方案。 为了解决这个问题,你需要在你的yaml部分放置下面的东西。 我还在本周早些时候在dev版本中添加了一个函数kableExtra_latex_packages()
,以提出以下文本。
header-includes:
- usepackage{booktabs}
- usepackage{longtable}
- usepackage{array}
- usepackage{multirow}
- usepackage[table]{xcolor}
- usepackage{wrapfig}
- usepackage{float}
- usepackage{colortbl}
- usepackage{pdflscape}
- usepackage{tabu}
- usepackage{threeparttable}
- usepackage[normalem]{ulem}
如果你很好奇为什么会有这种奇怪的行为,下面是一个简短的解释。 当您第一次在rmarkdown kableExtra
中加载kableExtra
时,它会尝试使用此包中随附的usepackage_latex()
函数将上面的LaTeX包信息放入rmarkdown元数据中。 如果你只是点击编织按钮,它会很好地工作,因为每个“编织+渲染”过程应该是孤立的。 然而,令人惊讶的是(顺便提一下,我们在这里看到它),如果你试图从控制台渲染,由于(我的假设)knitr或rmarkdown正试图重新使用一些缓存结果,所以这个过程无法复制。 事实证明,这些LaTeX软件包的依赖关系没有被放入正在生成的tex文件中,并最终出现错误。 如果关闭RStudio并重新启动它,当然,它所拥有的临时内存将会消失,您应该能够再次加载这些程序包。 我觉得它可能是一个全球变量相关的bug, 我想我们可以通过在render
函数的末尾添加“忘记元”部分来修复它,但我需要查看它。
部分原因是我没有在以前版本中使用的LaTeX软件包中提供足够的文档。 现在,我在本周早些时候发布的kableExtra 0.5.0包装小插图的最开始部分添加了关于此问题的新部分。 随时检查一下。 另外,如前所述,在当前的开发版本中,您可以使用函数kableExtra_latex_packages()
出列表。
在我的情况下,@Hao答案没有奏效......我终于在每次渲染执行后卸载了kableExtra包,如下所示:
rmarkdown::render('torender.Rmd')
detach("package:kableExtra", unload=TRUE)
应该也可以使用类似的东西来选择环境
rmarkdown::render('torender.Rmd',envir=new.env(some parameters))
这是更清洁....但我没有这样管理!
链接地址: http://www.djcxy.com/p/33477.html上一篇: Why does rendering a pdf from rmarkdown require closing rstudio between renders?
下一篇: RMarkdown / pandoc fails to knit Pdf with latex color commands