首页 > 解决方案 > 更新函数中的全局嵌套列表变量,无论深度如何

问题描述

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

这是一个例子:

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将更新为相同的值。

标签: r

解决方案


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 函数不会通过副作用进行操作,因此如果您可以安排将其返回,那就更好了。


推荐阅读