【问题标题】:Computationally heavy R vignettes计算量大的 R 小插曲
【发布时间】:2020-03-28 20:33:49
【问题描述】:

我目前正在将使用 knitr 的 JSS 文章转换为 R package vignette。但是,我对小插图的位置、结构以及我应该如何处理它需要的非常长的计算时间(在普通笔记本电脑上大约需要 2 天)存有疑问。

official documentation 几乎没有提供这方面的信息。 mailing list 答案中的简短说明是我在搜索时找到的唯一信息。 Brian Ripley 在这里写道:

特别是,CRAN 确实接受带有 Sweave 插图的包裹 检查时间太长——一个需要大约 8 小时 [...]。我们只是要求我们在提交时被告知。

Hadley Wickham's description of vignettes 表示将eval = FALSE 设置为块选项。但是,在我的情况下,这不是一种可行的方法,因为需要从计算中生成数据。

This presentation 建议将/inst/doc 用于预编译和繁重的小插图。但是,这与将 /vignettes 用于包小插曲(或什么?)的新指南不太一致。

目前,我已将源文件放在/vignettes 中,并创建了一个.RData 文件,其中包含计算成本最高的对象(而且也很大)。然后脚本检查对象是否可通过该.RData 文件获得,如果不是,则创建对象。所以要完全从头开始编译和运行,.RData 文件可以简单地删除。

有人对这个问题有一些经验或建议吗? 小插图应该在/vignettes 还是/inst/doc 中? 如果首选前者,我应该将.bib.RData等所需的文件放在哪里? 我必须承认我发现 /vignettes/inst/doc 有点令人困惑。

【问题讨论】:

  • 不幸的是,这确实是一个 CRAN 政策问题,而不是编程问题。最好的答案将来自给 CRAN 的电子邮件。你也可以试试 r-devel,但我怀疑他们会告诉你也去问问 CRAN。
  • @Thomas 是的,我现在明白了。我想这也是为了避免打扰 CRAN 维护人员(我敢肯定他们的时间已经太少了),并了解其他人是否以及如何处理类似问题。如果这不是不合适的,我会在这里留下问题,如果没有问题,我会稍后给维护者发电子邮件。
  • 有道理。如果您确实得到了 CRAN 的答复,我鼓励您在此处发布答复,以便其他人可以找到它。他们是忙碌的人,但维护系统也是他们(主要是自我任命的)工作,所以如果他们的帮助文件不清楚,他们有责任澄清事情。
  • 我遇到了同样的问题。你找到解决办法了吗?我的下一步是制作 .RData 文件数据文件,然后将它们抓取为小插图。
  • 我相信这个线程是最相关的。 stat.ethz.ch/pipermail/r-package-devel/2016q1/000748.html

标签: r package knitr cran


【解决方案1】:

我为基于 knitr 的小插图提出了以下解决方案。我假设您使用 devtools 进行包维护。为了防止 R 在包检查期间运行小插图代码(即R CMD check),这将使您包含计算量大的小插图,小插图必须:

  1. 使用不会混淆 R 代码的小插图引擎。换句话说,当您执行devtools::build_vignettes() 时,引擎不能在inst/doc 中生成.R 文件。 knitr 包提供了不会缠结 R 代码的引擎,包括 knitr::rmarkdown_notangle,它可以用作 knitr::rmarkdown 的替代品。
  2. 包括在检测到正在对R CMD check 的调用中执行块评估时动态禁用块评估的代码。这可以通过在小插图顶部放置代码来检查各种设置并在适当时使用knitr::opts_chunk$set(eval = ...) 设置块设置来实现。下面显示的代码是从 knitr 包中借来的,非常感谢 Yihui Xie 解决了这个问题。

以下是使用这两种策略的 rmarkdown 小插图文件的示例,以便可以使用 devtools::build_vignettes() 构建它,并且在 R CMD check 期间不会执行其代码。请注意,代码仍然在构建包时执行(例如,在devtools::build()devtools::check() 期间完成)。

---
title: "example vignette"
output:
  rmarkdown::html_document:
    self_contained: yes
fontsize: 11pt
documentclass: article
vignette: >
  %\VignetteIndexEntry{example vignette}
  %\VignetteEngine{knitr::rmarkdown_notangle}
---

```{r, include = FALSE}
is_check <- ("CheckExEnv" %in% search()) || any(c("_R_CHECK_TIMINGS_",
             "_R_CHECK_LICENSE_") %in% names(Sys.getenv()))
knitr::opts_chunk$set(eval = !is_check)
```

```{r}
Sys.sleep(100)
```

有关此方法的实际示例,see this vignette for a developmental package on GitHub

【讨论】:

  • 感谢您的回答,我只是将rmarkdown_notangle 用于我的一个包,它适用于windows,但不适用于linux 和mac。我遇到了类似的问题:stackoverflow.com/questions/26726388/…>。我使用最新版本的knitr,它是 CRAN 上的 1.17。你有什么想法吗?
  • 不知道抱歉,knitr 1.17 中的 rmarkdwon_notangle 在 Ubuntu 16.04 上为我工作。我唯一能想到的就是在 Github 上尝试开发版的 knitr?
  • 在检查 r-hub 和 win-builder 上的包时,上述解决方案对我来说效果很好,但由于某种原因并没有阻止小插图代码在 Travis CI (r-travis) 上运行。我发现@LyzanderR 的this blog post 建议使用'purl' knitr 选项来防止从小插图中提取源代码然后进行测试。单独的“purl”选项可以很好地防止代码在 Travis CI 上进行测试,但不能在 r-hub 和 win-builder 上进行测试。将这两种解决方案结合起来就可以了,即将 'eval' 和 'purl' 都设置为 FALSE。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-02
相关资源
最近更新 更多