如何使用R语言通过表单ID和令牌从ONA下载数据集?
如何使用R语言通过表单ID和令牌从ONA下载数据集?
嗨,我来帮你搞定这个问题!你之前用onaDownload函数没成功,大概率是因为这个函数属于某个不再维护的旧包,而且ONA现在更推荐用令牌(Token)做认证,而非用户名密码的方式。下面给你两种靠谱的解决方案,都是目前能用的:
方法一:用专门的ruODK包(推荐)
ruODK是专门为ODK生态(包括ONA这类基于ODK的平台)开发的R包,支持令牌认证,还能自动处理数据分页这类细节,用起来很省心:
- 先安装并加载包:
install.packages("ruODK") library(ruODK)
- 配置ONA的连接和认证信息
你需要先在ONA账号的设置里找到自己的API令牌,然后把服务器地址设为ONA的API地址:
ruODK::setup( url = "https://api.ona.io", token = "你的API令牌字符串", verbose = TRUE # 可选,开了之后能看到请求的详细日志,方便排查问题 )
- 下载表单数据
把form_id_string替换成你的实际表单ID(在ONA表单页面就能找到),然后调用函数获取数据:
form_id <- "form_id_string" dataobject <- ruODK::odata_submission_get(form_id = form_id)
方法二:用httr直接调用ONA的REST API
如果你喜欢自己控制HTTP请求的细节,可以用httr包直接调用ONA的官方API:
- 安装并加载所需的包:
install.packages(c("httr", "jsonlite")) library(httr) library(jsonlite)
- 构造请求并获取数据
同样需要替换表单ID和令牌,然后发送GET请求,最后解析返回的JSON数据为R的数据框:
# 替换成你的表单ID和令牌 form_id <- "form_id_string" token <- "你的API令牌字符串" # 发送认证请求 response <- GET( url = paste0("https://api.ona.io/api/v1/data/", form_id), add_headers(Authorization = paste("Token", token)) ) # 检查请求是否成功(如果报错会直接提示) stop_for_status(response) # 把返回的JSON数据转换成R数据框 dataobject <- fromJSON(content(response, "text"))
为啥你之前的代码没成功?
你用的onaDownload函数应该是某个旧包(比如ONA包)里的功能,但这个包已经很久没更新了,ONA的API认证方式也从用户名密码转向了令牌,所以旧函数自然失效啦。换成上面两种方法,就能顺利拿到数据了。
小提醒:
- 确保你的API令牌有访问目标表单数据的权限
- 表单ID可以在ONA表单的“设置”页面里找到,或者直接从表单页面的URL里提取
- 如果数据量特别大,
ruODK会自动处理分页;用httr的话,可以在URL里加?page=2这样的参数来分页获取
备注:内容来源于stack exchange,提问作者Ture
相关产品推荐
相关产品推荐

