【问题标题】:`bookdown`/`rmarkdown`/`knitr`: Child documents and path definition in `YAML` headers`bookdown`/`rmarkdown`/`knitr`:`YAML` 标头中的子文档和路径定义
【发布时间】:2018-05-19 04:01:05
【问题描述】:

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

---
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 会出现问题,因为主文档和子文档的工作目录不同,因此相对路径定义也不同。出路是:

  1. 在定义data_dir 时使用绝对/扩展路径名。 快速变长/笨拙。

  2. params 对象的后处理以扩展主文档中的路径。由于params 在从R 块中访问时是不可变的,因此只能以不优雅 的方式解决:

    ```{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

  3. YAML 标头中定义参数时,使用类似!R path.expand('data') 的方式就地扩展路径。虽然这(或基于 ` 的等效项)适用于示例中的 data 字段,但 knitring 在路径情况下 fails 因为 R 表达式是 not em> 扩展但用作字符表示 - 文字 "path.expand('data')" 显然不作为路径存在。

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

【问题讨论】:

    标签: r yaml knitr r-markdown bookdown


    【解决方案1】:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-12-20
      • 2018-12-10
      • 2015-11-14
      • 2014-06-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-05
      • 1970-01-01
      • 2016-10-11
      相关资源
      最近更新 更多