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

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

这是一个例子:

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

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 函数不会通过副作用运行,所以如果你能安排只返回它会更好。


以上是无论深度如何,都更新函数中的全局嵌套列表变量的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>