如何将服务器响应保存到动态变量?解决R代码覆写问题
解决R代码中请求响应被覆写的问题
原代码的问题在于生成变量名时仅使用了内层循环的j值,导致外层循环(遍历数据集)时,会覆盖之前循环生成的同名变量,最终只保留最后两次请求的结果。要实现将4次请求的响应分别保存为postOrgUnitsToDataset_1到postOrgUnitsToDataset_4,需要结合外层循环的i和内层循环的j生成唯一的变量名。
修改后的代码(生成独立变量)
datasets_uids <- c("b0ozQvcc7nP","D9CrlbX7KBV") servers <- c("url1","url2") for (i in 1:length(datasets_uids)) { for(j in 1:length(servers)){ # 通过(i-1)*服务器数量 + j计算出1-4的唯一序号 var_name <- paste("postOrgUnitsToDataset", (i-1)*length(servers) + j, sep="_") assign(var_name, httr::POST( paste0(servers[j],"dhis/api/dataSets/",datasets_uids[i],"/organisationUnits"), body=httr::upload_file("file.json"), httr::verbose(), httr::authenticate("username","password", type = "basic"), httr::content_type("application/json"), httr::progress("up"), httr::set_config(httr::config(ssl_verifypeer = 0L)) )) } }
关键修改说明
- 变量名生成逻辑:
(i-1)*length(servers) + j确保每次循环生成唯一序号:- 当
i=1(第一个数据集),j=1→1,j=2→2 - 当
i=2(第二个数据集),j=1→3,j=2→4
- 当
- 这样就能生成
postOrgUnitsToDataset_1到postOrgUnitsToDataset_4四个独立变量,不会被覆写。
更推荐的方案:用列表存储响应
生成大量独立变量不利于后续管理,推荐用列表统一存储所有响应,同时可以给列表元素命名以匹配预期的变量名:
datasets_uids <- c("b0ozQvcc7nP","D9CrlbX7KBV") servers <- c("url1","url2") response_list <- list() counter <- 1 for (i in 1:length(datasets_uids)) { for(j in 1:length(servers)){ response_list[[counter]] <- httr::POST( paste0(servers[j],"dhis/api/dataSets/",datasets_uids[i],"/organisationUnits"), body=httr::upload_file("file.json"), httr::verbose(), httr::authenticate("username","password", type = "basic"), httr::content_type("application/json"), httr::progress("up"), httr::set_config(httr::config(ssl_verifypeer = 0L)) ) # 给列表元素命名,和预期的变量名一致 names(response_list)[counter] <- paste("postOrgUnitsToDataset", counter, sep="_") counter <- counter + 1 } } # 访问单个响应示例 response_list$postOrgUnitsToDataset_1
列表方案的优势
- 避免全局环境中出现大量零散变量,保持环境整洁
- 方便批量处理响应(比如遍历列表检查所有请求的状态码)
- 可以通过名称或索引快速访问任意响应
内容的提问来源于stack exchange,提问作者Fred Kwebiha
相关产品推荐
相关产品推荐

