R语言通过get()获取向量后设置names属性报错解决方法
R中get()检索对象后设置names属性报错解决方案
报错原因
R的替换函数(即形如xxx() <- value的赋值语法)要求<-左侧必须是能直接定位到环境中变量绑定的表达式。get()函数仅会返回目标对象的拷贝值,不是环境中变量的绑定引用,因此执行names(get(paste0(n, '_scores'))) <- xxx时,R会尝试寻找不存在的get<-替换函数完成操作,最终抛出如下错误:
Error in get(paste0(n, "_scores")) <- `*vtmp*` : could not find function "get<-"
循环结束后手动执行names(test1_scores) <- test1_names能正常运行,是因为直接写变量名时R可以准确定位到全局环境中的变量绑定,不需要通过get()取值。
可行实现方案
方案1:assign阶段直接构造带属性的对象(推荐)
最高效的实现方式是在给变量赋值时,就直接设置好names属性,不需要后续再检索修改:
object_names <- c('test1', 'test2', 'test3') for (n in object_names) { score_val <- 1:5 name_val <- letters[1:5] # 先给临时向量设置names,再assign到目标变量名 names(score_val) <- name_val assign(paste0(n, '_scores'), score_val) assign(paste0(n, '_names'), name_val) }
方案2:临时变量中转后写回(适配已提前创建对象的场景)
如果对象已经提前创建完成、需要事后批量补设names属性,可以先把对象取到临时变量修改,再通过assign写回原变量名:
object_names <- c('test1', 'test2', 'test3') # 模拟已完成对象创建、未设置names的场景 for (n in object_names) { assign(paste0(n, '_scores'), 1:5) assign(paste0(n, '_names'), letters[1:5]) } # 批量设置names for (n in object_names) { # 取出目标对象和对应名称值到临时变量 tmp_score <- get(paste0(n, '_scores')) tmp_name <- get(paste0(n, '_names')) # 修改临时变量的names属性 names(tmp_score) <- tmp_name # 将修改后的对象重新绑定到原变量名 assign(paste0(n, '_scores'), tmp_score) }
注意:不要使用
eval(parse(text=...))拼接表达式的方式实现该需求,这类写法可读性差,且存在代码注入风险,上述两种assign方案完全可以覆盖使用场景。
内容的提问来源于stack exchange,提问作者ahummels
相关产品推荐
相关产品推荐

