为什么从rmarkdown渲染pdf需要在渲染之间关闭rstudio?

背景

我正在尝试使用render()渲染一个rmarkdown文档。 render调用有两个参数化元素:

  • 我希望用户能够指定pdf或html。 直接使用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的渲染也很好。

  • 任何人都可以告诉我,为什么我的pdf渲染的rmarkdown文档不能在rstudio的单个会话中呈现两次?
  • 同样,为什么rstudio必须在渲染之间关闭?

  • 嗯,让我先发布解决方案。 为了解决这个问题,你需要在你的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