如何声明一个R包的依赖关系,在这个包中你只使用S3/S4方法,而不使用导出?

pjngdqdw  于 2023-02-10  发布在  其他
关注(0)|答案(1)|浏览(93)

目前我的包DESCRIPTION中有一个对dbplyr的依赖项:

Imports:
    dbplyr,
    dplyr

dbplyr之所以有用,几乎完全是因为它定义了S3方法:https://github.com/tidyverse/dbplyr/blob/main/NAMESPACE。您调用以使用dbplyr的实际函数几乎完全来自dplyr
通过将dbplyr放入我的Imports中,它应该会自动加载,但不会附加,这应该足以注册它的S3方法:www.example.com网站。https://r-pkgs.org/dependencies-mindset-background.html#sec-dependencies-attach-vs-load.
这似乎工作正常,但每当我R CMD check时,它告诉我:

N  checking dependencies in R code (10.8s)
   Namespace in Imports field not imported from: ‘dbplyr’
     All declared Imports should be used.

首先,为什么R CMD check还要检查这个,考虑到加载包而不导入它们通常是有意义的;其次,我应该如何满足R CMD check的要求,而不加载我不想要或不需要的东西到我的命名空间中?

uujelgoq

uujelgoq1#

我很确定你的两个假设是错的。
首先,将Imports: dbplyr放入DESCRIPTION文件不会加载它,因此它的方法不会单独从DESCRIPTION文件加载。基本上,DESCRIPTION文件中的Imports字段只是保证dbplyr在请求时可以加载。如果您通过NAMESPACE文件导入一些内容,这将导致它被加载。如果你计算dbplyr::something,这将导致它被加载。执行loadNamespace("dbplyr")是另一种方法,还有其他一些方法。你也可以加载一些其他的包来加载它。
第二,我认为你误解了错误信息,它不是说你没有导入就加载了它(尽管它也会抱怨),而是说它不能检测到你的软件包中有任何使用它的情况,所以也许它不应该是安装你的软件包的必要条件。
不幸的是,检测用法的代码是容易出错的,所以有时候会漏掉一些用法,我听说过的例子有:

  • 如果软件包只在函数参数的默认值中使用。这个问题在R-devel中得到了修复。
  • 如果包只在构建期间用于构造某个对象,例如像someclass <- R6::R6Class( ... )这样的代码需要R6,但检查代码看不到它,因为它查看的是someclass,而不是创建它的源代码。
  • 如果通过在字符变量中指定包的名称来隐藏包的使用,则返回。
  • 如果对软件包的需求是间接的,例如,您需要使用ggplot2::geom_hex。这需要hexbin软件包,但ggplot2只将其声明为"建议"。

这些例子来自下面的讨论:www.example.com网站。https://github.com/hadley/r-pkgs/issues/828#issuecomment-1421353457 .
建议的解决方法是创建一个显式引用导入包的对象,例如,将行

dummy_r6 <- function() R6::R6Class

到您的包中就足以在不实际加载R6的情况下取消注解(如果您调用此函数,它将被加载)。
但是,您的要求更强烈:如果你想使用dbplyr的方法,你需要确保它已经被加载了。我会在你的.onLoad()函数里放一些东西来触发加载。例如,

.onLoad <- function(lib, pkg) {
  # Make sure the dbplyr methods are loaded
  loadNamespace("dbplyr")
}

编辑以添加:正如评论中所指出的,检查代码中有一个bug,这意味着它不会检测到这是对dbplyr的使用。

.onLoad <- function(lib, pkg) {
  # Make sure the dbplyr methods are loaded
  loadNamespace("dbplyr")
  # Work around bug in code checking in R 4.2.2 for use of packages
  dummy <- function() dbplyr::across_apply_fns
}

虚拟构造中使用的函数是任意的;它可能根本不需要存在,但我选择了一个存在的。

相关问题