目前我的包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
的要求,而不加载我不想要或不需要的东西到我的命名空间中?
1条答案
按热度按时间uujelgoq1#
我很确定你的两个假设是错的。
首先,将
Imports: dbplyr
放入DESCRIPTION
文件不会加载它,因此它的方法不会单独从DESCRIPTION
文件加载。基本上,DESCRIPTION
文件中的Imports
字段只是保证dbplyr
在请求时可以加载。如果您通过NAMESPACE
文件导入一些内容,这将导致它被加载。如果你计算dbplyr::something
,这将导致它被加载。执行loadNamespace("dbplyr")
是另一种方法,还有其他一些方法。你也可以加载一些其他的包来加载它。第二,我认为你误解了错误信息,它不是说你没有导入就加载了它(尽管它也会抱怨),而是说它不能检测到你的软件包中有任何使用它的情况,所以也许它不应该是安装你的软件包的必要条件。
不幸的是,检测用法的代码是容易出错的,所以有时候会漏掉一些用法,我听说过的例子有:
someclass <- R6::R6Class( ... )
这样的代码需要R6
,但检查代码看不到它,因为它查看的是someclass
,而不是创建它的源代码。ggplot2::geom_hex
。这需要hexbin
软件包,但ggplot2
只将其声明为"建议"。这些例子来自下面的讨论:www.example.com网站。https://github.com/hadley/r-pkgs/issues/828#issuecomment-1421353457 .
建议的解决方法是创建一个显式引用导入包的对象,例如,将行
到您的包中就足以在不实际加载
R6
的情况下取消注解(如果您调用此函数,它将被加载)。但是,您的要求更强烈:如果你想使用
dbplyr
的方法,你需要确保它已经被加载了。我会在你的.onLoad()
函数里放一些东西来触发加载。例如,编辑以添加:正如评论中所指出的,检查代码中有一个bug,这意味着它不会检测到这是对
dbplyr
的使用。虚拟构造中使用的函数是任意的;它可能根本不需要存在,但我选择了一个存在的。