我目前正在将使用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。