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 兼容的方式,可以在不使用或在说明中导入的情况下引用另一个包中的延迟加载数据。
解决方案
我的解决方法是为外部包导出一个 getter 函数,我也是它的作者。这是有效的,因为函数是可见的,但惰性数据和活动绑定(在我的情况下是在 中设置的.onLoad()
)不可见。
另一种可能性是使用命令这一事实::
,因此像这样的东西是有效的 R,并且通过 RHS 上的变量命名,它可以灵活地查询命名空间中数据的存在或不存在(不仅仅是search()
路径上的环境)
`::`(nycflights13, airlines)
::
只需将给定的符号替换为字符串,然后调用getExportedValue
.base
所以,更好的是,我认为这是我的最终答案:
base::getExportedValue(asNamespace("nycflights13"), "airlines")
这在没有任何requireNamespace()
或的情况下有效library()
。
推荐阅读
- google-cloud-platform - 在存储桶上创建每个服务帐户目录
- php - 在 CodeIgniter 中显示连接两个表的数据和图像
- laravel - 使用 laravel excel 和 postgresql 导入大型 csv 文件
- sql - 查询和分组多个列属性,例如具有许多作者的书籍
- c# - Xamarin Firebase 如何将没有密钥的单个子记录读入 .AsObservable .Subscribe 快照
- javascript - 是否可以获取与给定 Microsoft 团队用户的对话 ID
- python-3.x - 从列表中修剪数据以适合特定形状,例如地理数据框地图
- javascript - 如何在 useEffect 挂钩中使用 Const 中的变量?反应 JS
- javascript - Jest spyOn 仅在第二次调用和第三次调用时模拟实现
- sql - ComboBox 不接受所选项目的 Null