我目前正在将使用knitr的JSS文章转换为R包插图。但是,我对小插图的位置,结构以及如何处理需要的非常长的计算时间(在普通笔记本电脑上需要2天左右)感到怀疑。

official documentation几乎没有提供有关此方面的信息。
mailing list中答案中的简短注释是我在搜索时发现的唯一信息。 Brian Ripley在这里写道:


特别是,CRAN确实接受带有Sweave vignettes的软件包,
检查时间太长-一个人大约要花8个小时[...]我们只是要求在提交时告知我们。


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

This presentation建议将/inst/doc用于预编译的小插图。但是,这与关于将/vignettes用于程序包渐近线的新准则(或什么?)不太一致。

当前,我已将源文件放置在/vignettes中,并创建了一个.RData文件,其中包含计算上最昂贵的对象(并且它也很大)。然后,脚本检查该对象是否可通过该.RData文件使用,否则,将创建对象。因此,要完全重新编译并运行,可以直接删除.RData文件。

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

最佳答案

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


使用不缠结R代码的装饰图案引擎。换句话说,当您执行.R时,引擎不得在inst/doc中产生devtools::build_vignettes()文件。 Knitr软件包提供了不会缠结R代码的引擎,包括可以用作knitr::rmarkdown_notangle替代品的knitr::rmarkdown的引擎。
包含代码,当它检测到在对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

08-24 14:43