R包函数中使用saveRDS无法通过错误检查的问题咨询
问题根源
你的错误本质是R CMD check在隔离的临时环境中运行,测试用例里指定的本地绝对路径(E:/Tag data)不存在,和saveRDS代码行本身无关,但因为这行代码需要写入到data_folder,会提前触发路径存在性检查,所以你误以为是这行导致的失败。
解决方案
1. 重构测试用例(核心修正)
R包测试不能依赖本地文件路径,必须使用包内自带的测试数据:
- 在包的根目录创建
inst/extdata文件夹,把测试用的123456-Archive.csv放进去。 - 修改测试脚本
test-process_tag_data.R,使用包内数据路径:test_that("process_tag_data() imports a tag archive", { # 获取包内测试数据的文件夹路径 data_folder <- system.file("extdata", package = "YourPackageName") # 调用函数 result <- process_tag_data( Tag_ID = "123456", tag_deploy_UTC = "2013-10-25 02:46:00", tag_release_UTC = "2013-10-31 09:30:00", data_folder = data_folder, archive = "123456-Archive.csv", date_time_col = 1, depth_col = 2, time_zone = "Asia/Tokyo" ) # 添加验证逻辑,比如检查输出是否为数据框 expect_s3_class(result, "data.frame") })
2. 给函数添加路径合法性检查
在函数开头加入路径验证,提前给出明确错误:
process_tag_data <- function(Tag_ID, tag_deploy_UTC, tag_release_UTC, data_folder, archive, date_time_col, depth_col, time_zone) { # 检查数据文件夹是否存在 if (!dir.exists(data_folder)) { stop(sprintf("数据文件夹不存在: %s", data_folder), call. = FALSE) } # 检查archive文件是否存在 archive_path <- file.path(data_folder, archive) if (!file.exists(archive_path)) { stop(sprintf("Archive文件不存在: %s", archive_path), call. = FALSE) } # 原函数逻辑... # 保存结果(后续调整为可选) saveRDS(full_day_crop_ts, file = file.path(data_folder, "archive_days.Rds")) return(full_day_crop_ts) }
3. 让保存操作变为可选(符合R包规范)
R包函数默认不应该自动写入文件到用户目录,添加参数让用户决定是否保存:
# 修改函数参数,添加save_output默认值为FALSE process_tag_data <- function(Tag_ID, tag_deploy_UTC, tag_release_UTC, data_folder, archive, date_time_col, depth_col, time_zone, save_output = FALSE) { # ... 原路径检查和处理逻辑 ... # 仅当用户指定save_output=TRUE时才保存 if (save_output) { save_path <- file.path(data_folder, "archive_days.Rds") saveRDS(full_day_crop_ts, file = save_path) message(sprintf("结果已保存到: %s", save_path)) } return(full_day_crop_ts) }
这样测试时可以设置save_output = FALSE,避免在检查环境中写入文件,同时用户使用时可以主动开启保存功能。
4. 修正示例代码
确保示例里的路径提示用户替换,或者用包内数据示例:
#' @examples #' ## 使用包内示例数据 #' data_folder <- system.file("extdata", package = "YourPackageName") #' full_day_archive <- process_tag_data( #' Tag_ID = "123456", #' tag_deploy_UTC = "2023-10-25 02:46:00", #' tag_release_UTC = "2023-10-31 09:30:00", #' data_folder = data_folder, #' archive = "123456-Archive.csv", #' date_time_col = 1, #' depth_col = 2, #' time_zone = "Asia/Tokyo", #' save_output = TRUE #' )
内容的提问来源于stack exchange,提问作者R student
相关产品推荐
相关产品推荐

