snotelr包snotel_download函数报错:non-character argument求助
SNOTEL数据下载报错:non-character argument in strsplit
我长期使用snotelr包的snotel_download()函数获取SNOTEL数据,一直正常。但在R 4.3.3环境中运行以下代码时:
library(snotelr) df <- snotel_download(site_id = c(429,1287), internal = TRUE)
收到错误提示:
Error in strsplit(df$site_name, "(") : non-character argument
已经更新到snotelr最新版本,问题仍存在,求技术帮助。
可行解决方案
1. 绕开包内部处理,手动读取数据
错误根源是包内部尝试对非字符类型的site_name列执行strsplit。可以先下载原始CSV文件,再手动读取并修正类型:
# 下载CSV文件到本地(不直接加载到内存) snotel_download(site_id = c(429,1287), internal = FALSE) # 读取每个站点的CSV,确保字符串不自动转为因子 df_429 <- read.csv("429.csv", stringsAsFactors = FALSE) df_1287 <- read.csv("1287.csv", stringsAsFactors = FALSE) # 合并多个站点的数据 df <- rbind(df_429, df_1287) # 按需强制转换site_name为字符型 df$site_name <- as.character(df$site_name)
2. 临时修改包函数逻辑
用trace()工具给包内部代码插入类型转换步骤,避开错误:
# 先查看snotel_download的函数代码,找到调用strsplit的位置 body(snotel_download) # 假设strsplit在第X行,在它前面插入类型转换(替换X为实际行号) trace("snotel_download", quote({ df$site_name <- as.character(df$site_name) }), at = X) # 重新运行下载代码 df <- snotel_download(site_id = c(429,1287), internal = TRUE) # 恢复原函数逻辑 untrace("snotel_download")
3. 排查数据源格式变化
SNOTEL官网可能调整了数据返回格式,导致包解析失效。直接访问目标站点的CSV下载链接,检查site_name列是否存在、内容是否为字符串类型。如果数据源本身返回的site_name是缺失值或非字符内容,需要针对性处理。
4. 反馈问题给包开发者
如果上述方法都无效,说明包与R 4.3.3存在兼容性问题,或者官网数据格式更新导致包逻辑过时。可以在snotelr的代码仓库提交Issue,附上你的R版本、包版本、报错信息和测试代码,请求开发者修复。
内容的提问来源于stack exchange,提问作者jane
相关产品推荐
相关产品推荐

