r语言 - 在不附加包的情况下获取延迟数据



背景:

我有一个 CRAN R 包,它依赖于特定版本的另一个 CRAN 包中的延迟加载数据。我需要避免使用::来引用数据,因为它会导致 CRAN 检查失败。

我读过:在不附加包的情况下评估包环境中的功能和查看包中是否存在变量/函数?

我已经尝试过(在这个例子中使用nycflights13):

# this works, but I can't use ::
nycflights13::airlines
find("airlines")
# character(0)
get("airlines", envir = asNamespace("nycflights13"), mode = "list")
#Error in get("airlines", envir = asNamespace("nycflights13"), mode = "list") : object 'airlines' of mode 'list' was not found
# attach
library(nycflights13)
get("airlines", envir = asNamespace("nycflights13"), mode = "list")
# works
find("airlines")
# [1] "package:nycflights13"

这可能会使它更加复杂,但我实际上想引用一个活动绑定,它返回可能可用也可能不可用的数据。

我想要什么:

一种与 CRAN 兼容的方式,用于引用另一个包中的延迟加载数据,而无需在 DESCRIPTION 中使用::或导入。

我的解决方法是为外部包导出一个 getter 函数,我也是该包的作者。这是有效的,因为函数是可见的,但惰性数据和活动绑定(在我的情况下,在.onLoad()中设置)不是。

另一种可能性是使用::是一个命令的事实,因此像这样的东西是有效的R,并且通过RHS上的变量命名,它可以灵活地查询命名空间中是否存在数据(而不仅仅是search()路径上的环境)

`::`(nycflights13, airlines)

::只是用给定的符号代替字符串,并在base中调用getExportedValue

所以,更好的是,我认为这是我的最终答案:

base::getExportedValue(asNamespace("nycflights13"), "airlines")

这无需任何requireNamespace()library()即可工作。

最新更新