代码之家  ›  专栏  ›  技术社区  ›  boshek

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

  •  17
  • boshek  · 技术社区  · 8 年前

    出身背景

    我正在尝试制作一个rmarkdown文档,该文档使用 render() render

    • output_format() .
    • 我还想向文档传递一个参数,以指定表(使用 kableExtra 包装)是latex或html。

    这是名为test的rmarkdown文件。Rmd

    ---
    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会话,我可以同时运行这两个会话 提供 再一次 我得到以下错误:

    “C:/Program Files/RStudio/bin/pandoc/pandoc”+RTS-K512m-RTS --突出显示样式探戈--latex engine pdflatex--variable graphics=yes--variable“geometry:margin=1in”!未定义的控件 序列\开始{tabular}{rrrrl}\t规则

    潘多克。exe:生成PDF时出错错误:pandoc文档转换 测验utf8.md--到latex--从

    html呈现一次又一次地工作良好。如果我关闭rstudio,然后连接项目,pdf的渲染效果也很好。

    问题

    • 同样,为什么rstudio必须在渲染之间关闭?
    4 回复  |  直到 8 年前
        1
  •  27
  •   Hao    7 年前

    2019-01-21更新:

    针织纽扣和 render 功能是,knit按钮总是从一个“新环境”(我们都能感觉到)开始,而 提供 parent.env()

    render(input, ..., envir = parent.frame(), ...)
    

    在函数文档中,我们看到

    envir   
    The environment in which the code chunks are to be evaluated 
    during knitting (can use new.env() to guarantee an empty new 
    environment).
    

    因此,我们可以模拟单击 knit envir = new.nev() 在渲染调用中。


    原始答案:

    嗯,让我先发布解决方案。为了解决这种行为,您需要在yaml部分中添加以下内容。我还添加了一个函数 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}
    

    如果你想知道为什么会有如此奇怪的行为,这里有一个简短的解释。第一次加载时 kableExtra 在降价环境中,它将 try to put the LaTeX package information above into the rmarkdown metadata 使用 usepackage_latex() function 提供 功能,但我需要这样看。

    package vignette 本周早些时候发布的kableExtra 0.5.0。请随意查看。此外,正如我前面所说,在当前的开发版本中,可以使用函数打开列表 .

        2
  •  7
  •   Patricia    8 年前

    在我的情况下,@Hao答案不起作用。。。我最终在每次渲染执行后卸载了kableExtra包,如下所示:

    rmarkdown::render('torender.Rmd')
    detach("package:kableExtra", unload=TRUE)
    

    也可以使用以下方式选择环境:

    rmarkdown::render('torender.Rmd',envir=new.env(some parameters))
    

    哪个更干净。。。。但我没有这样做!

        3
  •  4
  •   Curtis    7 年前

    我有一个类似的问题:一个用于呈现包含表的PDF报告的循环。PDF不能用booktabs=T呈现。我的解决方案是在从循环中调用的Rmd脚本中手动加载我的设置块中的所有latex包。

    usepackage_latex("booktabs")
    usepackage_latex("longtable")
    usepackage_latex("array")
    usepackage_latex("multirow")
    usepackage_latex("xcolor", "table")
    usepackage_latex("wrapfig")
    usepackage_latex("float")
    usepackage_latex("colortbl")
    usepackage_latex("pdflscape")
    usepackage_latex("tabu")
    usepackage_latex("threeparttable")
    usepackage_latex("threeparttablex")
    usepackage_latex("ulem", "normalem")
    usepackage_latex("makecell")
    

    希望这能帮助一些人。

        4
  •  0
  •   dnidz    6 年前

    output: 
      pdf_document:
        includes:
          in_header: headers.tex
    

    \usepackage{booktabs}
    \usepackage{longtable}
    \usepackage{array}
    \usepackage{multirow}
    \usepackage{wrapfig}
    \usepackage{float}
    \usepackage{colortbl}
    \usepackage{pdflscape}
    \usepackage{tabu}
    \usepackage{threeparttable}
    \usepackage{threeparttablex}
    \usepackage[normalem]{ulem}
    \usepackage{makecell}
    \usepackage{xcolor}