代码之家  ›  专栏  ›  技术社区  ›  Andrew John Lowe

knitr:当尚未安装bookdown时,交叉引用公式、图表和表格?

  •  1
  • Andrew John Lowe  · 技术社区  · 8 年前

    这是对的后续问题 this . 我知道,在knitr生成的PDF中交叉引用图形和表格的规范方法是使用 bookdown::pdf_document2 (详细信息 here ).

    这太棒了! 但是假设我想将Rmd发送给一个没有 预订 已安装?如何确保文档在以下环境中进行渲染: 预订 尚未安装?我希望所有内容都包含在一个Rmd文件中。文档的使用者可能是以前很少或没有R经验的人,并且刚刚安装了R和RStudio,但没有安装任何软件包。我如何确保如果他们点击 编织 他们会得到带有交叉引用的PDF?或者,如果 Binder 或者类似的方法提供了执行(或者更好的是,编织到PDF)Rmd文件的方法,与Jupyter笔记本电脑的执行方法大致相同——我希望能够将以自动方式呈现PDF所需的一切绑定到Rmd文件本身。

    示例文档如下所示:

    ---
    title: "Cross-refs test"
    author: "Me"
    date: "13 December 2017"
    output:
      bookdown::pdf_document2:
        citation_package: natbib
        fig_caption: yes
        keep_tex: yes
    ---
    
    ```{r setup, include=FALSE}
    knitr::opts_chunk$set(echo = TRUE)
    ```
    
    ## Title
    
    \begin{equation}
    f\left(k\right)=\binom{n}{k}p^k\left(1-p\right)^{n-k} \label{eq:binom}
    \end{equation}
    
    You may refer to it using `\@ref(eq:binom)`, e.g., see Equation \@ref(eq:binom).
    

    因此,如果这个Rmd文件是由脑死亡僵尸或活页夹下载和编织的,我如何确保不会发生这种情况:

    Error in loadNamespace(name) : there is no package called 'bookdown'
    Calls: <Anonymous> ... tryCatch -> tryCatchList -> tryCatchOne -> <Anonymous>
    Execution halted
    

    我不能假设我的Rmd的消费者会知道在这种情况下该做什么,也不能假设我不控制的任何自动过程会从Rmd中呈现PDF,它会从某个地方的回购中获取(就像Binder所做的那样)。

    如果有 交叉引用,我可以指定 pdf_document 作为输出格式,RStudio将读取YAML和if knitr公司 R标记 如果未安装,则会自动触发安装(用户/脑死亡僵尸只需单击“确定”即可接受安装),并呈现PDF。因此,如果缺少这两个包:没问题,至少在使用RStudio时是这样。用户获取Rmd,安装R和Rstudio,编织Rmd,然后出现PDF。如果使用 预订 获取交叉引用。

    似乎YAML是在执行R代码之前解释的,因此与 this 用于打印文档中的当前时间( date: "`r Sys.time()`" )不起作用。否则,我会 r install.packages("bookdown") 在这里

    那么,有没有一种方法可以在不使用bookdown的情况下进行交互引用,但要像使用bookdown一样简单优雅,或者有没有某种方法可以触发knitr安装bookdown,以便在遇到这种情况时渲染不会崩溃 bookdown::pdf_文档2 ?

    基本上,我想要的是在一个编织的PDF中进行交叉引用,并尽可能少地进行用户干预——因为我的用户可能是一个脑死亡的僵尸或机器人。

    我想避免硬编码交叉引用。我宁愿不使用乳胶。如果可能的话,只需要纯R Markdown和一些knitr魔法。

    1 回复  |  直到 8 年前
        1
  •  2
  •   Yihui Xie    8 年前

    有两条路要走:

    1. 避免技术问题的最简单方法是在“云”上预安装所有内容,并让用户使用“云”。例如,您可以安装 RStudio Server ,并预安装生成文档所需的所有软件包。那么你的用户只需要一个网络浏览器。如果您要求他们在本地计算机上安装软件包, 这已经够复杂了 要安装R、RStudio和LaTeX,我不相信他们还会为安装一件事哭泣: install.packages('bookdown') .

    2. 如果他们必须在本地安装所有内容 安装包('bookdown') 结果仍然是一个巨大的痛苦,你可以做的是创建一个RStudio项目 packrat 已启用(或启用 packrat公司 在现有项目中)。这应该确保当用户使用此项目时,所有必要的R包都可用。

    有关我不想将此功能backport到 R标记 软件包,请参阅 this Github issue .