如何在R循环中结合get与paste获取全局变量的指定元素?
解决
get()结合索引获取全局变量元素的问题 问题场景
我需要运行一个分批次处理的程序,先处理1-100次迭代,退出后重启处理101-200次,依此类推。计划通过source()加载程序并传入全局变量实现该需求。
调用程序代码:
GlobVar1<-1:100 GlobVar2<-101:200 GlobVar3<-201:300 GlobVal<-2 source("C:/Users/JSparks/Documents/testreceiveargs.R")
在被调用的testreceiveargs.R中:
- 直接指定变量名加索引能正常输出201、202:
for (i in (1:2)) { print(GlobVar3[i]) } - 通过
get()获取整个变量能正常输出[1] 101 102 103 ...:for (i in (1:2)) { print(get(paste0("GlobVar",GlobVal))) } - 但尝试将索引拼进字符串传给
get()时触发错误:
错误信息:for (i in (1:2)) { print(get(paste0("GlobVar",GlobVal,"[i]"))) }Error in get(paste0("GlobVar", GlobVal, "[i]")) : object 'GlobVar2[i]' not found
解决方法
方法1:先获取变量再索引
你之前的错误是把[i]直接拼进了变量名字符串,get()会尝试寻找名为GlobVar2[i]的对象,而非GlobVar2的第i个元素。正确逻辑是先通过get()拿到完整变量,再对其做索引操作:
for (i in (1:2)) { print(get(paste0("GlobVar", GlobVal))[i]) }
运行后会正确输出101、102。
方法2:改用列表存储批次数据(更推荐)
这种变量名拼接的方式不够规范,维护性差。建议把所有批次数据放进一个列表,通过索引直接访问:
调用程序修改为:
batch_data <- list( batch1 = 1:100, batch2 = 101:200, batch3 = 201:300 ) current_batch <- 2 source("C:/Users/JSparks/Documents/testreceiveargs.R")
被调用的testreceiveargs.R中代码:
for (i in 1:2) { print(batch_data[[current_batch]][i]) }
这种方式逻辑更清晰,也避免了变量名拼接带来的潜在问题。
内容的提问来源于stack exchange,提问作者JohnS
相关产品推荐
相关产品推荐

