未加载R包时如何在函数内访问包内数据?
问题原因
用usethis::use_data(my_data)默认创建的是公开懒加载数据集,这类数据存储在包的package:myPkg环境中,而非包的命名空间(namespace:myPkg):
- 执行
library(myPkg)时,package:myPkg会被加入搜索路径,函数能找到my_data; - 用
myPkg::c_my_data(2)调用时,函数运行在包的命名空间内,直接引用my_data会在命名空间中查找,自然找不到数据。
解决方案
方案1:保留公开数据集属性,函数内部显式加载
修改c_my_data.R中的函数,在内部用utils::data()将数据集加载到函数运行环境:
#' Data Adder #' @param x a number #' @export c_my_data <- function(x) { # 显式加载my_data到当前函数环境 utils::data("my_data", envir = environment()) c(my_data, x) }
这种方式既保留my_data作为公开数据集的属性(用户仍可通过data(my_data)或加载包后访问),又能保证不加载包时函数正常调用。
方案2:将数据设为包内部专用(不对外公开)
如果my_data仅作为函数内部依赖,无需对外暴露,可将其设置为内部数据:
- 修改
data-raw/datasets.R中的代码,添加internal = TRUE参数:
# called from datasets.R in project data-raw folder my_data <- c("A") usethis::use_data(my_data, internal = TRUE)
- 删除
data.R文件(内部数据无需生成文档)。 - 重新构建包后,
my_data会被放入包的命名空间,原函数无需修改即可通过myPkg::c_my_data(2)正常调用。
注意:此方案下用户无法直接访问my_data,适合纯内部依赖的数据场景。
内容的提问来源于stack exchange,提问作者Richard
相关产品推荐
相关产品推荐

