基于变量名R的名称列表元素

时间:2015-05-20 13:57:11

标签: r list rename

我希望动态地将元素添加到空列表中。列表中的每个元素都应在一组值变化后自动命名。

但是,我似乎找不到一种方法来动态命名列表元素而不会出错。请考虑以下示例:

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

有办法做到这一点吗?

2 个答案:

答案 0 :(得分:5)

您无法使用#include <memory> class C { public: C() {} protected: int a; float b; std::shared_ptr<C> c; } 运算符分配给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 ,则可以为每个列表命名元素使用来自函数调用的参数和sapply选项。

在一般意义上,当列表的最终大小和结构不为人所知时,R对于随着时间的推移而不断增长的列表进行了非常好的优化。虽然它可以做到,但更多的是&#34; R-ish&#34;这样做的方法是提前弄清楚结构。

答案 1 :(得分:1)

另一种方法是使用 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