更改R中动态选择的列表的值

时间:2018-10-10 02:40:39

标签: r

我在base R中有许多列表,我想遍历这些列表并更改列表元素。我想在一行中进行此更改,硬编码每个列表的名称不是一种选择:

a <- list(thing1=1:5,
          thing2=6:10)

b <- list(thing1=1:5,
          thing2=6:10)

for(list in c("a","b"){

   an_element <- paste(list,
                       "$thing1",
                      sep="") # i.e "a$thing1"

    assign(an_element,20:25) # change value of element thing1 in lists

}

get("a$thing1") # shows change

a$thing1 # does not show change

assign的文档所示,对象a尚未更改。我无法将a传递到后续函数中,并且期望thing1的值保持不变。我需要一种使变量分配的目标动态化的方法。

2 个答案:

答案 0 :(得分:1)

使用您的示例:

a <- list(thing1=1:5,
          thing2=6:10)

有很多方法可以遍历列表的元素:

anames <- names(a)
anames
# [1] "thing1" "thing2"
for(i in 1:length(anames)) {
  print(a[[anames[i]]])
}
# [1] 1 2 3 4 5
# [1]  6  7  8  9 10

使用此索引,您也可以设置一个值

for(i in 1:length(anames)) {
  a[[anames[i]]] <- 5*(i+2)+1:5
  print(a[[anames[i]]])
}
# [1] 16 17 18 19 20
# [1] 21 22 23 24 25

或者您可以直接使用索引

for(i in 1:length(anames)) {
  a[[i]] <- 5*(i+2)+1:5
  print(a[[anames[i]]])
}
# same result

你可以申请

b <- lapply(a, function(x) {
  x+15
})
b$thing1
#[1] 16 17 18 19 20

我认为没有一种干净的方法可以通过Assign

答案 1 :(得分:0)

找到了解决方案。

a <- list(thing1=1:5,
          thing2=6:10)

b <- list(thing1=1:5,
          thing2=6:10)

c <- list(thing1=1:5,
          thing2=6:10)

for(list in c("a","b","c")){

  assign("tempList",list)

  tempList$thing1 <- 6:10

  assign(list,tempList)

}

a$thing1 # shows change
b$thing1
c$thing1

此处强调目标是要处理大量列表,而不必重复要修改的每个列表的行。您可以将活动列表(循环中的活动列表)动态分配给修订名称的临时列表。然后您对该列表进行操作。对于背景,我正在尝试从“ vars”包中覆盖VAR模型的数据矩阵。我有一个预测问题,需要修改大量VAR模型的数据,然后根据它们生成预测。