You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

关于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.13 07:25:55