R语言如何编程动态定义赋值运算符左侧的变量名
报错原因
R的赋值运算符<-要求赋值符号左侧必须是可绑定值的语言对象(比如直接声明的变量名、合法索引位置),而str_c("variable_", i)运行后返回的是普通字符串常量,不属于合法的赋值目标,因此会抛出target of assignment expands to non-language object错误。
实现方案
方案1:使用
assign()函数动态创建全局变量assign()是R内置的专门用于动态给指定变量名赋值的函数,需要明确指定变量绑定的环境,避免变量只存在于循环/函数的临时执行环境中、运行结束就被销毁。
循环实现代码:library(stringr) for (i in 1:10) { assign( x = str_c("variable_", i), # 动态生成的变量名字符串 value = i, # 要绑定的值 envir = .GlobalEnv # 指定绑定到全局工作环境 ) }purrr::map实现代码:library(tidyverse) map(1:10, ~{ assign( x = str_c("variable_", .x), value = .x, envir = .GlobalEnv ) })运行上述任意一段代码,即可在当前工作环境生成
variable_1到variable_10共10个变量,每个变量的值对应自身序号。方案2:用命名列表统一管理动态变量(更推荐)
零散生成的全局变量后续批量操作、溯源管理都很麻烦,生产环境更推荐把同类型动态变量存在命名列表中,不需要修改全局环境,调用和批量运算都更便捷:library(tidyverse) # 一步生成带名称的变量列表 var_list <- set_names(1:10, ~str_c("variable_", .x)) # 按名调用单个变量 var_list$variable_5 #> [1] 5 # 批量运算无需遍历全局环境 sum(unlist(var_list)) #> [1] 55
内容的提问来源于stack exchange,提问作者arnle
相关产品推荐
相关产品推荐

