英文:
Updating a value in a nested list by having the position as an integer vector
问题
让我们考虑我有一个嵌套列表
x = list(a1 = list(b1 = list(c1 = 1), b2 = list(d1 = 1, d2 = 2, d3 = 3)))
此外,我有一个索引,给出了嵌套列表中的位置,以及我想要更新的值
index = c(1,1,1) # 应该更新c1
value = 100
手动操作如下
x[[1]][[1]][1] = value
x
我也知道可以这样写
index = c(1,2,2) # 应该更新d2
`[[`(`[[`(`[[`(x, 1), 2), 2) = value
x
问题:有没有一种编程方式来设置嵌套列表的索引处的值?
要仅读取该值,可以按以下方式进行 - 但这不允许我更改它。
ifuns <- lapply(index, function(i) {function(x) `[[`(x, i)})
Funcall <- function(f, ...) f(...)
Reduce(Funcall, rev(ifuns), x, right = TRUE)
这明显失败了
Reduce(Funcall, rev(ifuns), x, right = TRUE) <- value
Error in Reduce(Funcall, rev(ifuns), x, right = TRUE) <- value :
could not find function "Reduce<-"
英文:
Let's consider I have a nested list
x = list(a1 = list(b1 = list(c1 = 1), b2 = list(d1 = 1, d2 = 2, d3 = 3)))
Further I have an index, giving me the position in the nested list, and a value that I want to update
index = c(1,1,1) # should update c1
value = 100
Manually I can do is as follows
x[[1]][[1]][1] = value
x
I also know I can write it as such
index = c(1,2,2) # should update d2
`[[`(`[[`(`[[`(x, 1), 2), 2) = value
x
Question: Is there a programmatic way to set the value at index for the nested list?
To only read the value I could go the following way - but it does not allow me to change it.
ifuns <- lapply(index, function(i) {function(x) `[[`(x, i)})
Funcall <- function(f, ...) f(...)
Reduce(Funcall, rev(ifuns), x, right = TRUE)
This (obviously) fails
Reduce(Funcall, rev(ifuns), x, right = TRUE) <- value
Error in Reduce(Funcall, rev(ifuns), x, right = TRUE) <- value :
could not find function "Reduce<-"
答案1
得分: 2
你是在寻找这个吗?
x[[index]] <- value
# > x
# $a1
# $a1$b1
# $a1$b1$c1
# [1] 100
#
#
# $a1$b2
# $a1$b2$d1
# [1] 1
#
# $a1$b2$d2
# [1] 2
#
# $a1$b2$d3
# [1] 3
英文:
Are you looking for this?
x[[index]] <- value
# > x
# $a1
# $a1$b1
# $a1$b1$c1
# [1] 100
#
#
# $a1$b2
# $a1$b2$d1
# [1] 1
#
# $a1$b2$d2
# [1] 2
#
# $a1$b2$d3
# [1] 3
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论