无论深度如何,都更新函数中的全局嵌套列表变量
我正在尝试创建一个可以更新全局环境变量中选定值的函数。更复杂的是,这些值位于嵌套列表中,并且位置的深度可能会有所不同。
这是一个例子:
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 <- TRUE到L$Foo$Bar$VAR <- FALSE和L$Lorem$Ipsum$Dolor$VAR <- TRUE到L$Lorem$Ipsum$Dolor$VAR <- FALSE。如您所见,嵌套列表中的变量名称在VAR我要更新的所有变量中都是相同的。
因此,我正在寻找一个可以更新VAR嵌套列表中所有变量的函数,无论有多深VAR。
EDIT VAR将更新为相同的值。
回答
1) rrapply 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) rapply如果知道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 函数不会通过副作用运行,所以如果你能安排只返回它会更好。