我希望动态地将元素添加到空列表中.列表中的每个元素都应在一组值变化后自动命名.
但是,我似乎找不到一种方法来动态命名列表元素而不会出错.考虑以下示例:
L <- list()
var1 <- "wood"
var2 <- 1.0
var3 <- "z4"
varname <- paste(var1, as.character(var2), var3, sep="_")
# This works fine:
L$"wood_1_z4" <- c(0,1)
L$"wood_1_z4"
0 1
# This doesn't!!
L$paste(var1, as.character(var2), var3, sep="_") <- c(0,1)
Error in L$paste(var1, as.character(var2), var3, sep = "_") <- c(0, 1) :
invalid function in complex assignment
# Ths doesn't either ...
L$eval(parse(text = "varname")) <- c(0,1)
Error in L$eval(parse(text = "varname")) <- c(0, 1) :
target of assignment expands to non-language object
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点?
你不能指定paste()使用<-运算符(我相信这对于eval()函数也是如此).相反,您需要使用[[运算符或使用该names()函数.你可以这样做:
L <- list()
var1 <- "wood"
var2 <- 1.0
var3 <- "z4"
varname <- paste(var1, as.character(var2), var3, sep="_")
# Using [[
L[[varname]] <- c(0,1)
> L
$wood_1_z4
[1] 0 1
# Using names()
L[[1]] <- c(0,1)
names(L)[1] <- varname
> L
$wood_1_z4
[1] 0 1
Run Code Online (Sandbox Code Playgroud)
更有效的方法可能是使用既创建值又命名列表元素的函数,或者甚至只创建值的函数 - 如果您随后使用sapply,则可以使用调用您的参数来命名每个列表元素功能和USE.NAMES选项.
在一般意义上,当列表的最终大小和结构不为人所知时,R对于随着时间的推移而不断增长的列表并不是非常优化的.虽然可以做到,但更为"R-ish"的方法就是提前弄清楚结构.
小智 5
另一种方法是使用包setNames()中的包装器stats,如下所示:
var1 <- "wood"
var2 <- 1.0
var3 <- "z4"
varname <- paste(var1, as.character(var2), var3, sep="_")
L <- setNames(list(c(0, 1)), varname)
> L
$wood_1_z4
[1] 0 1
Run Code Online (Sandbox Code Playgroud)