背景:
我有一个CRAN R包,它依赖于特定版本的另一个CRAN包中的延迟加载数据。我需要避免使用::
来引用数据,因为它会导致CRAN检查失败。
我读过:Evaluate function within package environment without attaching package和See if a variable/function exists in a package?
我试过(在这个例子中使用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中的Imports的情况下引用另一个包中的延迟加载数据。
我的解决方法是为外部包导出一个getter函数,我也是作者。这是有效的,因为函数是可见的,但是惰性数据和活动绑定(在我的情况下,在.onLoad()
中设置)不是。
另一种可能性是使用::
是一个命令的事实,所以像这样的东西是有效的R,并且在RHS上使用变量命名,它将能够灵活地查询命名空间中数据的存在或不存在(而不仅仅是search()
路径上的环境) )
`::`(nycflights13, airlines)
::
只是将给定的符号替换为字符串,并在getExportedValue
中调用base
。
所以,更好的是,我认为这是我的最终答案:
base::getExportedValue(asNamespace("nycflights13"), "airlines")
这没有任何requireNamespace()
或library()
。