在开发R包时,我通常只打开Packrat并使用本地化的存储库,然后在会话中进行开发。但是在发布包时,回忆并手动添加我在开发包中使用过的每个依赖项是一件非常头疼的事情。有(半)自动的方法吗?
例如,在NodeJS开发中,我们只需使用npm install --save
,依赖项就会自动添加到package.json
中。
是的,使用roxygen2
生成NAMESPACE
文件。
生成包级文档的示例方法:
#' @details
#' tabular{ll}{
#' Package: tab cr
#' Type: tab Packagecr
#' Version: tab 1.0.0cr
#' Date: tab 2016-05-15cr
#' License: tab MIT cr
#' }
#' @useDynLib pkg
#' @importFrom Rcpp evalCpp
#' @importFrom methods is
#' @importFrom stats ts as.ts is.ts
#' @import ggplot2
"_PACKAGE"
注意:我倾向于将导入语句放在包级别的文档中。您可以在函数文档中使用这些相同的语句。
对特定导入使用@importFrom <pkg> <function1> <function2>
。
否则,请对给定包中的所有函数使用@import <pkg>
。
编辑
要将其锁定到特定版本,您需要修改DESCRIPTION
文件的Imports:
部分,如下所示:
Imports:
Rcpp (>= 0.12.5),
scales (<= 0.4.0),
grid (== 0.7-4),
stats
实现这一点的一种常见方法(尽管"老派"R程序员很少使用这种方法,据我所知,他们手动维护NAMESPACE
文件…)是在代码中手动插入roxygen2@importFrom
语句。。。例如
# returns a true family() object iff one was given
## to glmmTMB() in the first place ....
##' @importFrom stats family
##' @export
family.glmmTMB <- function(object, ...) {
object$modelInfo$family
}
尽管拥有一个自动化系统肯定会有所帮助,但如果没有其他东西,也可以提供提示。当然,以这种方式维护依赖关系(确保为每个有依赖关系的函数根据需要添加@importFrom
语句)比在开发代码后跟踪何时(仍然)需要依赖关系要好。
- R扩展指南称,
@import
和@importFrom
(翻译为import
和importFrom
语句)都是合法的有选择地使用importFrom而不是导入是一种很好的做法,尤其是当从具有十几个导出的包中导入时,建议使用importFrom。
("良好实践"翻译为"如果你不这样做,CRAN维护人员会大喊大叫"…)
- 我不知道是否有一种方法可以执行版本化的
importFrom
语句:R在DESCRIPTION
文件的Imports:
字段中放置包版本依赖项,在NAMESPACE
文件中放置importFrom
语句:roxygenn2自动生成这些信息,但我认为从roxygenn指令到NAMESPACE
/DESCRIPTION
信息的映射不够精细,无法支持这一点 - 运行
R CMD check --as-cran
会提示需要导入的推荐包中的函数