R 将嵌套环境转换为嵌套列表

R 将嵌套环境转换为嵌套列表,r,list,recursion,environment,R,List,Recursion,Environment,我真的认为我在这里遗漏了一些非常明显的东西,但我就是无法指出:如何将rappy()和as.list()或eapply()或两者结合起来,以便递归地将嵌套的环境转换为嵌套的列表 实际上我想要的是类似于as.list(,recursive=TRUE)的东西,我认为rappy()在这方面会很有用 这就是嵌套环境: env <- new.env() env$world <- new.env() env$world$europe <- new.env() env$world$europe

我真的认为我在这里遗漏了一些非常明显的东西,但我就是无法指出:如何将
rappy()
as.list()
eapply()
或两者结合起来,以便递归地将嵌套的
环境
转换为嵌套的
列表

实际上我想要的是类似于
as.list(,recursive=TRUE)
的东西,我认为
rappy()
在这方面会很有用

这就是嵌套环境:

env <- new.env()
env$world <- new.env()
env$world$europe <- new.env()
env$world$europe$germany <- new.env()
env$world$europe$germany$foo <- 1
env$world$europe$germany$bar <- 2
这里有什么诀窍?

自定义函数:
rappy
仅适用于嵌套列表;使用递归

nested_env_list <- function(env) {
  out <- as.list(env)
  lapply(out, function(x) if (is.environment(x)) nested_env_list(x) else x)
}
然后R将为所有未来的环境自动计算出它。如果您希望在一些选定的位置使用旧行为,请显式使用
base::as.list.environment
。 例如:

>环境自定义函数:
rappy
仅适用于嵌套列表;使用递归

nested_env_list <- function(env) {
  out <- as.list(env)
  lapply(out, function(x) if (is.environment(x)) nested_env_list(x) else x)
}
然后R将为所有未来的环境自动计算出它。如果您希望在一些选定的位置使用旧行为,请显式使用
base::as.list.environment
。 例如:


>env好的,谢谢!我以为已经有比这更快的“内置”东西了。但是我想没有,对吧?关于如何覆盖S3方法的很好的补充!据我所知并非如此。:)好的,谢谢!我以为已经有比这更快的“内置”东西了。但是我想没有,对吧?关于如何覆盖S3方法的很好的补充!据我所知并非如此。:)您提到了eapply--f=function(x)if(is.environment(x))eapply(x,f)else x。谢谢!一旦你看到它,就很明显;-)您提到了eapply--f=function(x)if(is.environment(x))eapply(x,f)else x。谢谢!一旦你看到它,就很明显;-)
nested_env_list <- function(env) {
  out <- as.list(env)
  lapply(out, function(x) if (is.environment(x)) nested_env_list(x) else x)
}
 > env <- new.env(); env$a <- new.env(); env$a$b <- 1; env$a$c <- 2; env$d <- 4
 > dput(nested_env_list(env))
 structure(list(a = structure(list(b = 1, c = 2), .Names = c("b", "c")), d = 4), .Names = c("a", "d"))
as.list.environment <- function(env) {
  out <- base::as.list.environment(env)
  lapply(out, function(x) if (is.environment(x)) as.list(x) else x)
}
 > env <- new.env(); env$a <- new.env(); env$a$b <- 1; env$a$c <- 2; env$d <- 4
 > dput(as.list(env))
 structure(list(a = structure(list(b = 1, c = 2), .Names = c("b", "c")), d = 4), .Names = c("a", "d"))