有没有办法在DESCRIPTION文件中自动生成`Imports`节?

问题描述:

在开发R包时,我常常打开Packrat并使用本地化的存储库,并在开发过程中进行开发。但是在发布这个软件包的时候,回顾并手动添加我在开发的软件包中使用的每个依赖项是一件非常头疼的事情。是否有(半)自动的方式来做到这一点?有没有办法在DESCRIPTION文件中自动生成`Imports`节?

例如,在NodeJS开发中,我们可以使用npm install --save,依赖关系将自动添加到package.json

+1

I *认为*标准的方式做到这一点是在代码中手动插入roxygen(2)'@ importFrom'语句... –

+1

至少,它是一个非常普遍的方式。 – joran

+0

@joran:更好的方式? (或者你指的是(AFAIK)老派/ R核开发人员不倾向于使用roxygen的事实) –

一种常见的方式做到这一点(虽然不是一个的二手备受“老派” 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语句)优于试图跟踪开发代码之后依赖关系是否仍然需要的依赖关系()。

  • @import@importFrom(其转化为importimportFrom陈述)都是合法的,将R extensions guide

    使用importFrom选择,而不是进口是很好的做法,从封装,多了一个导入时建议特别十几个出口。

(“良好做法”转换为“如果你不CRAN维护者会大喊” ......)

  • 我不知道是否有做版本importFrom方式语句,R把包版本依赖于Imports:字段中DESCRIPTION文件和importFrom语句在NAMESPACE文件:roxygen2自动生成该信息,但我不认为从roxygen2指令映射到NAMESPACE/DESCRIPTION通知它足以支持...
  • 运行R CMD check --as-cran提供了有关需要导入的建议包中的函数的提示。

是的,使用roxygen2来生成您的NAMESPACE文件。

实例的方式来产生包级别的文档:

#' @details 
#' \tabular{ll}{ 
#' Package: \tab \cr 
#' Type: \tab Package\cr 
#' Version: \tab 1.0.0\cr 
#' Date: \tab 2016-05-15\cr 
#' License: \tab MIT \cr 
#' } 
#' @useDynLib pkg 
#' @importFrom Rcpp evalCpp 
#' @importFrom methods is 
#' @importFrom stats ts as.ts is.ts 
#' @import ggplot2 
"_PACKAGE" 

注:我倾向于保持我的import语句一起包级别的文档。您可以在功能文档中使用这些相同的语句。

对于特定的进口,使用@importFrom <pkg> <function1> <function2>

否则,使用@import <pkg>来获得给定包中的所有功能。

编辑

将其锁定到一个特定的版本,则需要修改DESCRIPTION文件的Imports:部分,像这样:

Imports: 
    Rcpp (>= 0.12.5), 
    scales (<= 0.4.0), 
    grid (== 0.7-4), 
    stats 
+0

它处理特定版本吗?你认为使用Roxygen2和Packrat进行依赖处理是多余的吗? – trVoldemort

+0

我更喜欢使用函数文档的import语句,因为它明确了* where代码中需要一个给定的函数 - 如果代码稍后消失,则知道不再需要依赖项。 –

+1

请注意编辑版本特定的软件包加载。 @BenBolker我发现在调用包的函数时,集中所有内容并在包名称空间之前预先调整它是比较容易的,例如'stats :: is.ts()'因为我很少删除依赖关系。再次,这两种方法都是有效的。 – coatless