在不附加包的情况下获取惰性数据

时间:2019-01-30 16:29:53

标签: r cran

背景:

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

我读过: Evaluate function within package environment without attaching packageSee 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的情况下引用另一个程序包中的延迟加载数据。

1 个答案:

答案 0 :(得分:-1)

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

另一种可能性是使用::是命令这一事实,因此类似这样的内容是有效的R,并且在RHS上使用变量命名,这将使查询名称空间中数据存在或不存在的灵活性变得更加灵活(不仅是search()路径上的环境)

`::`(nycflights13, airlines)

::只是将给定的符号替换为字符串,然后在getExportedValue中调用base

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

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

此方法无需任何requireNamespace()library()