如何在R包中正确引入依赖项?

27

我已经努力数个小时来构建R中的一个软件包,并且对我的进展缓慢感到有些绝望。我成功地快速构建了一个没有依赖关系的软件包,一切都正常工作。由于几篇文章的推荐,我正在使用R Studio、devtools和Roxygen2(在Windows上)。当存在依赖关系时,我在CHECK时(例如使用devtools::check())遇到问题:

检查R代码中的依赖项... 注意:导入字段中未从'ggplot2'导入名称空间。所有声明的导入项应该被使用。请参阅“创建R软件包”章节中的“Writing R Extensions”手册中的“DESCRIPTION文件”的信息。

此外,check()会删除NAMESPACE中的import(ggplot2)行。如果我使用check(document=F),它会给出一个关于未加载的digest软件包的加密错误。我读过“Writing R Extensions”-1.1.3软件包依赖性和Hadley的Wiki,了解如何编写软件包,但无法解决我的问题。CRAN中其他R软件包的DESCRIPTION和NAMESPACE文件看起来与我的没有什么不同(至少在我的眼中)?

问题:我做错了什么?非常抱歉问这样一个基础的问题,但我很困惑,到目前为止,我看到的大多数逐步教程在解释依赖关系之前就停止了。

到目前为止,我有3个文件:
一个DESCRIPTION文件:

Package: test
Type: Package
Title: Foo
Version: 1.0
Date: 2014-03-21
Author: Bar
Maintainer: Foo <bar@mail.com>
Description: Blubb
Imports:
    ggplot2
License: GPL-3

命名空间:

export(is.equal.null)
import(ggplot2)

一个 R 文件:

#' Extension of compare to include NULLs
#'
#' Works as an extension to usual compare
#' Compares two basic objects which in addition to usual compare can be NULL
#' Intuitive output: TRUE if both are equal or NULL resp., FALSE if both are unequal or only one is NULL
#'
#' @param obj1 Basic object like \code{numeric, char, boolean, NULL}
#' @param obj2 Basic object like \code{numeric, char, boolean, NULL}
#' @keywords compare
#' @export
#' @examples
#' is.equal.null(5,5)  # TRUE
#' is.equal.null(5,NULL)  # FALSE
#' is.equal.null(NULL,NULL)  # TRUE
is.equal.null <- function(obj1, obj2) {
  # Small helper function to generalize comparison to comparison of NULL
  # returns TRUE if both are NULL, and FALSE if only one of the objects is NULL
  bool <- obj1==obj2 
  #qplot(obj1)
  if (length(bool)) return(bool)
  if (is.null(obj1) & is.null(obj2)) return(TRUE)
  return(FALSE)
}
2个回答

27

您需要在两个地方声明导入:

  1. 描述文件。您应该有一行类似于:

    Imports: ggplot2, pkg1, pkg2
    
  2. NAMESPACE文件。在这里声明您需要的软件包

  3. import(ggplot2)
    

    或者为了避免命名空间冲突

    importFrom(ggplot2, geom_point)
    

    使用@import@importFrom标签,您可以让roxygen2维护NAMESPACE文件。

在您的示例中,您的DESCRIPTION文件看起来不错,但您还没有将必要的函数添加到NAMESPACE中。


在我的NAMESPACE文件的顶部,我导入了几个包,并且在我的DESCRIPTION文件中将它们全部列在Imports下面,但是当我安装我的软件包时它们仍然没有被安装。我错过了什么吗?另外,@csgillespie,当你说你可以让roxygen2维护NAMESPACE文件时,你是什么意思?我一直在重新添加这些导入,而不是在roxygenise之后。 - mikey
roxygen2 可以生成命名空间文件。 - csgillespie
是的,但是当我使用roxygen2生成命名空间文件时,它不包括导入,只包括导出,所以我必须手动添加它们。 - mikey
2
尝试访问 https://dev59.com/QF4b5IYBdhLWcg3wchNL。 - csgillespie
谢谢@csgillespie!现在NAMESPACE文件已经正确创建,但是当我从源代码安装包时,依赖项仍然无法安装。但这是一个单独的问题。 - mikey

4

如Hadley所描述的标准工作流程包括:

library(devtools)

# Add a dependency
use_package('tibble')

# (Re-)build NAMESPACE
document()

# Reload the package: CTRL-L or
load_all()

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接