You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用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),通过函数读取和更新:

  1. 初始化数据文件
    在包的 inst/extdata/ 目录下创建初始数据文件(如果目录不存在先创建),比如 country_vis.rds:
# 初始化空数据框
initial_df <- data.frame(country = character(), date = Date())
saveRDS(initial_df, "inst/extdata/country_vis.rds")
  1. 编写读取数据的内部函数
.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)
}
  1. 编写更新数据的内部函数
.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.07 15:25:10