r - `bookdown`/`rmarkdown`/`knitr` : Child documents and path definition in `YAML` headers

标签 r yaml knitr r-markdown bookdown

我正在构建一个广泛使用子文档的报告基础结构(通过 {r, child = 'somedir/child_doc.Rmd'} )并通过 params 参数化YAML 中的字典主文档的标题。一个例子可能是:

---
title: Project Report
subtitle: POIGNANT DESCRIPTION OF THE WORK AT HAND
date: '`r format(Sys.time(), "%d %B, %Y")`'
output:
  bookdown::pdf_document2:
    template: ~
    toc: yes
    toc_depth: 2
colorlinks: yes
fontsize: 11pt
documentclass: scrartcl
geometry: margin=1in, a4paper
params:
  submodule:
    value:
      intro:
        data_dir: 'data'
---

使用这种结构,访问 data_dir由于主文档和子文档的工作目录不同,因此变得有问题,因此相对路径定义也不同。出路是:
  • 在定义 data_dir 时使用绝对/扩展路径名. 快速变长/笨拙。
  • params 的后处理对象以扩展主文档中的路径。如paramsR 内部访问时是不可变的 block ,这只能在 中解决不雅方式:
    ```{r params-processing, include = FALSE}
    local_params <- params
    local_params$submodule$intro$data_dir <- path.expand(local_params$submodule$intro$data_dir)
    

    其次是local_params的内部使用而不是 params .
  • 使用类似 !R path.expand('data') 的路径就地扩展在 YAML 中定义参数时标题。虽然这(或基于 ` 的等价物)适用于 data示例中的字段 knitr学习 失败 在路径情况下为 R表达式未扩展,但用作字符表示 - 和文字 "path.expand('data')"显然不作为路径存在。

  • 我很感激任何关于如何巧妙地解决这个问题的提示 - 特别是 3. 是否可以工作......

    最佳答案

    source code of r-yaml (由 bookdown::render_book 隐式调用)表明您可以通过使用 expr 解析相对路径来相当容易地解决选项 3。标签:

    params:
      submodule:
        value:
          intro:
            data_dir: !expr normalizePath('data')
    

    这会评估 YAML 中的 R 表达式,不需要任何进一步的处理。
    data_dir: !r normalizePath('data')也是可接受的语法,由 knitr 处理.不幸的是,!R 都没有。或 `r ,你试过的两个,都被解释了。

    我还建议使用 normalizePath相反,因为它返回给定任何相对目录的绝对路径。您使用 path.expand 的示例仅执行波浪号扩展,因此对局部相对路径没有影响,例如 'data' . normalizePath实际调用path.expand作为第一步。

    像往常一样简单地访问完全扩展的路径
    ```{r params-processing}
    print(params$submodule$intro$data_dir)
    ```
    ## $value
    ## [1] "/Users/user_name/full_path_to_book/my_book/data"
    ##
    ## $expr
    ## [1] "normalizePath('data')"
    ##
    ## attr(,"class")
    ## [1] "knit_param_expr"
    

    注意,最好使用 !r视为 r-yaml行为可能会改变,因为它当前会引发警告:
    Warning message:
    In yaml.load(readLines(con), error.label = error.label, ...) :
      R expressions in yaml.load will not be auto-evaluated by default in the near future
    

    关于r - `bookdown`/`rmarkdown`/`knitr` : Child documents and path definition in `YAML` headers,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47654521/

    相关文章:

    function - 将带点的线添加到 ggplot2 中的绘图中

    r - 在r中生成大量样本

    删除 R 中 apply 语句和函数后面的逗号

    bash - 在 Yaml 中解析 Bash 数组

    r - 检查是否在 rmarkdown::render 期间运行

    html - 向 html rmarkdown 文档添加水平规则隐藏文本部分

    r - 为什么我不能在 RStudio 中安装 "forecast"包?

    从 Windows 命令提示符交互式运行 R

    GoYAML 结构 slice

    string - 有没有办法表示在 YAML 文档中的多行上没有任何空格的长字符串?