如何自动加载R包package1的全部数据集供package2使用?
如何自动加载另一个R包的全部数据集?
问题场景
我有两个R包:
- package1,内置数据集d1、d2、d3
- package2,需要调用package1里的所有数据集
目前可以通过package1::d1这种方式单独访问数据集,但想实现自动加载package1的全部数据集,尝试了以下代码但无法生效:
ds <- data(package = "package1") # 可用"carData"包测试 ds$results[1, 3] # 获取第一个数据集名称 mydataset <- load(ds$results[1, 3]) # 此代码无法运行
另外尝试直接用data()函数传入获取到的数据集名称也失败:
ds$results[1, 3] # Item # "d1"
执行data(ds$results[1, 3])时出现警告:
Warning message: In data(ds$results[1, 3]) : data set ‘ds$results[1, 3]’ not found
需要一个支持多平台(Windows、Mac)的可行方案,其他用户也会使用这两个包。
可行解决方案
方案1:批量调用data()函数加载
data()函数支持通过list参数传入数据集名称向量来批量加载,无需逐个调用。步骤如下:
# 获取package1的所有数据集名称 ds_names <- data(package = "package1")$results[, "Item"] # 批量加载所有数据集到当前环境 data(list = ds_names, package = "package1")
方案2:在package2中自动触发加载
如果需要用户安装package2后自动加载package1的全部数据集,可以在package2的R目录下新建zzz.R文件,写入.onLoad()函数:
.onLoad <- function(libname, pkgname) { # 获取package1的数据集名称 ds_names <- data(package = "package1")$results[, "Item"] # 批量加载到全局环境(或指定环境) data(list = ds_names, package = "package1", envir = parent.env(environment())) }
用户加载package2时,package1的所有数据集会自动加载,无需手动执行加载命令。
关键说明
data(list = ...)是官方支持的批量加载方式,直接传入字符串向量即可,比循环逐个调用更高效- 使用
.onLoad()时,可通过envir参数控制数据集加载的环境,避免污染package2的命名空间 - 两种方案均支持Windows、Mac等多平台,符合CRAN包的规范要求
内容的提问来源于stack exchange,提问作者Christoph
相关产品推荐
相关产品推荐

