我在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
的值保持不变。我需要一种使变量分配的目标动态化的方法。
答案 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模型的数据,然后根据它们生成预测。