r - 更新函数中的全局嵌套列表变量,无论深度如何
问题描述
我正在尝试创建一个可以更新全局环境变量中选定值的函数。更复杂的是,这些值位于嵌套列表中,并且位置的深度可能会有所不同。
这是一个例子:
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 函数不会通过副作用进行操作,因此如果您可以安排将其返回,那就更好了。
推荐阅读
- spring-boot - 使用 testng 进行 Spring Boot 单元测试
- python - 仅用于一个功能的python装饰器通常没有用,对吗?
- php - Laravel Eloquent 4 表关系
- php - 如何创建将在特定日期更新我的网站的 PHP 脚本
- r - 如何在 R 中加速循环计算中的循环
- javascript - Javascript 变量在 array.filter 操作期间丢失值
- react-native - `react-native init` vs `create-react-native-app` 然后弹出?
- animation - 为 rgb led arduino 创建灯光动画
- wordpress - 帖子对象中不存在 Wordpress 高级自定义字段
- java - 服务器套接字不循环