关于R语言ls()作用域与环境机制的困惑求解
R语言闭包与作用域解惑
先看你提供的代码:
weird_ls <- function() { some_env <- new.env() assign("a", value = 1, envir = some_env) assign("b", value = 2, envir = some_env) out <- function() { ls(envir = some_env) } return(out) }
调用结果:
> f <- weird_ls() > f() [1] "a" "b"
你的疑惑核心是对R中**闭包(Closure)**特性的不了解,这是R作用域规则里的关键知识点:
- R中的函数是「闭包」,它不仅包含执行代码,还会绑定自己被定义时所在的环境(而非调用时的环境)。
- 当
weird_ls执行时,会创建自己的局部环境,some_env就是在这个环境里定义的。随后定义的out函数,会把这个局部环境作为自己的「定义环境」保存下来。 - 当你把
out赋值给全局环境的f并调用f()时,f会优先在自己的定义环境(也就是weird_ls的局部环境)里查找some_env,自然能找到这个对象,进而执行ls(envir = some_env)得到结果。 - 哪怕
weird_ls执行完毕,只要f还存在,它绑定的那个局部环境就不会被回收,some_env也就一直能被访问到。
内容的提问来源于stack exchange,提问作者weakCoder
相关产品推荐
相关产品推荐

