gpt4 book ai didi

r - 无论深度如何,都更新函数中的全局嵌套列表变量

转载 作者:行者123 更新时间:2023-12-03 21:43:05 25 4
gpt4 key购买 nike

我正在尝试创建一个可以更新全局环境变量中选定值的函数。更复杂的是,这些值位于嵌套列表中,并且位置的深度可能会有所不同。
这是一个例子:

L <- list()

L$Foo <- list()
L$Foo$Bar <- list()
L$Foo$Bar$VAR <- TRUE

L$Lorem <- list()
L$Lorem$Ipsum <- list()
L$Lorem$Ipsum$Dolor <- list()
L$Lorem$Ipsum$Dolor$VAR <- TRUE
我正在尝试更新 L$Foo$Bar$VAR <- TRUEL$Foo$Bar$VAR <- FALSEL$Lorem$Ipsum$Dolor$VAR <- TRUEL$Lorem$Ipsum$Dolor$VAR <- FALSE .如您所见,嵌套列表中的变量名称 VAR , 在我想要更新的所有变量中都是相同的。
因此,我正在寻找一个可以更新所有 VAR 的函数。嵌套列表中的变量,无论多深 VAR是。
编辑 VAR将更新为相同的值。

最佳答案

1) 回复 rrapply包裹 rrapply 会走路 L对于满足第二个参数定义的条件的每个元素,它将运行第三个参数,用该参数的输出替换该值。

library(rrapply)

L2 <- rrapply(L, function(x, .xname) .xname == "VAR", function(x) FALSE)
str(L2)
给予:
List of 2
$ Foo :List of 1
..$ Bar:List of 1
.. ..$ VAR: logi FALSE
$ Lorem:List of 1
..$ Ipsum:List of 1
.. ..$ Dolor:List of 1
.. .. ..$ VAR: logi FALSE
2) 回复 如果知道 VAR组件是唯一的逻辑组件(在问题的示例中就是这种情况)然后 rapply在 R 的基础上可以使用。
rapply(L, function(x) FALSE, classes = "logical", how = "replace")
3) 基 R 仅使用基数 R,我们可以递归地遍历树以查找指示的名称并将其值替换为 FALSE。
replace_name <- function(x, name, value) {
if (is.list(x)) {
Map(function(nm)
if (nm == name) value else replace_name(x[[nm]], name, value), names(x)
)
} else x
}

replace_name(L, "VAR", FALSE)
全局环境
如果我们在函数内通过上述方法之一计算了 L2 并且想用它替换全局环境中的 L 作为函数的副作用,那么我们可以使用以下任何一种:
.GlobalEnv$L <- L2

L <<- L2

assign("L", L2, .GlobalEnv)
通常 R 函数不会通过副作用运行,所以如果你能安排只返回它会更好。

关于r - 无论深度如何,都更新函数中的全局嵌套列表变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66168120/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com