如何用use_data更新R包内部数据?代码执行后数据未更新
问题解答
1. 是否需要重建包或引用环境?
是,必须重建包并重新加载才能看到更新。原因如下:
usethis::use_data(internal = TRUE)会将数据保存到包的R/sysdata.rda文件中,这个文件是包的核心组成部分,只有重新编译安装包(比如用devtools::install()或 IDE 中的重建包快捷键),新的数据才会被打包进包。- 当前 R 会话中的
country_vis变量和包内部存储的是两个独立的对象,直接修改会话中的变量不会影响sysdata.rda里的数据,必须通过use_data覆盖文件后重建包,才能让包的内部数据更新。
2. 是否属于use_data的合理用法?更好的实现方式是什么?
这种用法不合理。use_data(internal = TRUE) 的设计目的是存储包的静态内部数据(比如固定的配置表、参考数据集),这些数据在包发布后通常不会变动。而你需要的是可动态更新的数据,用这种方法每次更新都要重建包,效率极低且不符合工具的设计场景。
更好的实现方式:外部文件存储
因为数据更新频率低,无需数据库,推荐将数据存储在包的外部文件中(比如 RDS、CSV),通过函数读取和更新:
- 初始化数据文件
在包的inst/extdata/目录下创建初始数据文件(如果目录不存在先创建),比如country_vis.rds:
# 初始化空数据框 initial_df <- data.frame(country = character(), date = Date()) saveRDS(initial_df, "inst/extdata/country_vis.rds")
- 编写读取数据的内部函数
.get_country_vis <- function() { # 获取文件的绝对路径 file_path <- system.file("extdata", "country_vis.rds", package = "你的包名") # 如果文件不存在则初始化 if (!file.exists(file_path)) { init_df <- data.frame(country = character(), date = Date()) saveRDS(init_df, file_path) return(init_df) } # 读取最新数据 readRDS(file_path) }
- 编写更新数据的内部函数
.update_country_vis <- function(new_country, entry_date) { # 读取现有数据 current_df <- .get_country_vis() # 追加新行(注意用data.frame而不是c(),避免类型转换问题) new_row <- data.frame(country = new_country, date = entry_date) updated_df <- dplyr::bind_rows(current_df, new_row) # 保存更新后的数据 file_path <- system.file("extdata", "country_vis.rds", package = "你的包名") saveRDS(updated_df, file_path) }
使用时,调用 .update_country_vis("中国", Sys.Date()) 即可更新数据,无需重建包;需要读取数据时调用 .get_country_vis() 就能获取最新内容。
内容的提问来源于stack exchange,提问作者Tech Commodities
相关产品推荐
相关产品推荐

