如何在 R 中直接读取 OSF 上的 CSV 文件而不保存到本地?
可以。把 OSF 文件的直接下载链接传给 read.csv(),就能将 CSV 读入 R 数据框,无需先保存本地 CSV 文件。文件内容仍会通过网络传输到运行 R 的环境中。
为什么原来的方法没有成功?
https://osf.io/dzr4e/files/74y5r 是文件的网页地址,通常返回展示文件的 HTML 页面。read.csv() 需要的是 CSV 文本,无法自动从预览页面中提取数据。
其中,dzr4e 是项目 ID,74y5r 是目标文件 ID。OSF 官方文档给出的下载链接格式是 https://osf.io/download/文件ID/,因此应使用:
https://osf.io/download/74y5r/
这种格式只需文件 ID,不需要保留项目路径或添加 ?action=download。参考 OSF 文件链接说明
直接使用 read.csv() 读取
如果文件仍公开可访问,且内容以逗号分隔,可以这样读取:
urlOSF <- "https://osf.io/download/74y5r/"
test <- read.csv(
file = urlOSF,
header = TRUE,
na.strings = "NA",
stringsAsFactors = FALSE
)
head(test)
str(test)
read.csv() 的 file 参数支持完整 URL。读取结果保存在内存中的 test 对象里,无需保存本地 CSV,也不需要安装 osfr。参考 R 数据导入文档
读取后,用 head(test) 和 str(test) 检查列名、字段类型和内容是否符合预期。即使函数没有报错,也要确认读到的是目标数据。
read.csv() 和 read.csv2() 应该选哪个?
根据 CSV 的实际格式选择:
| 函数 | 默认字段分隔符 | 默认小数点 |
|---|---|---|
read.csv() | 逗号 , | 句点 . |
read.csv2() | 分号 ; | 逗号 , |
如果文件用逗号分隔字段,通常应使用 read.csv()。换成 read.csv2() 无法解决链接或 HTTP 错误。参考 R 函数说明
如何理解 osf_download() 的冲突错误?
osf_download() 会将 OSF 文件保存到本地,默认保存在当前工作目录。如果目标位置已有同名文件,默认参数 conflicts = "error" 会中止下载,对应的就是问题中的 stop_dl_conflict() 提示。参考 osfr 下载文档
conflicts 参数可以处理文件重名的情况,但文件仍会下载到本地。如果只想直接读入数据框,用下载直链配合 read.csv() 更简单。
如果下载直链仍然报错
先检查文件是否仍公开可访问,以及文件 ID 是否正确。问题中的错误指向 https://osf.io/download/dzr4e/,这里填入了项目 ID,应改为目标文件 ID 74y5r。
500 Internal Server Error 表示服务器返回了内部错误。仅凭这条信息,无法断定是多写了一个斜杠导致的,更换 CSV 解析函数也无法解决。如果使用正确链接后仍持续报错,需要进一步检查文件访问状态或 OSF 服务情况。
脚本存放在 GitHub 上不会改变读取方式。实际运行脚本的电脑或 CI 环境必须能够访问该下载链接。
备注:内容仅供参考。
