创建并检查环境
使用 new.env()、environment()、ls() 和 get() 操作环境
创建并检查环境 是 CoddyKit 上的免费 R Academy 课时。 这是第 4 节课,共 4 节。 你可以在下方免费阅读本课时的完整内容 — 然后在浏览器中使用内置代码编辑器和全天候 AI 导师进行实践。 这是 R Academy 学习路径的一部分,你的进度在网页和 CoddyKit 应用中同步。 R Academy 课程共包含 4 节课。
创建新环境
new.env(parent = e) 会创建一个全新的空环境。parent 参数用于指定:当新环境中找不到名称时,应搜索哪个环境。要创建完全隔离的环境,请使用 emptyenv()。
# Isolated environment (no parent chain)
e1 <- new.env(parent = emptyenv())
# Environment with global as parent
e2 <- new.env(parent = globalenv())
cat('e1 parent:', environmentName(parent.env(e1)), '\n')
cat('e2 parent:', environmentName(parent.env(e2)), '\n')assign() — 添加绑定
assign('name', value, envir = e) 会在指定环境中创建或更新一个命名绑定。它相当于以编程方式执行 e$name <- value,但即使名称存储在变量中也可以使用。
e <- new.env(parent = emptyenv())
assign('x', 10, envir = e)
assign('y', 'hello', envir = e)
assign('z', TRUE, envir = e)
cat('x:', get('x', envir = e), '\n')
cat('y:', get('y', envir = e), '\n')get() 与 mget()
get('name', envir = e) 会获取单个绑定。mget(c('a','b'), envir = e) 会一次获取多个绑定,并返回一个带名称的列表。如果名称不存在,两者都会引发错误(除非 inherits 允许沿环境链搜索)。
e <- new.env(parent = emptyenv())
e$alpha <- 1
e$beta <- 2
e$gamma <- 3
# Single
get('alpha', envir = e)
# Multiple
mget(c('alpha', 'beta', 'gamma'), envir = e)ls() — 列出绑定
ls(envir = e) 会返回环境 e 中所有绑定名称组成的字符向量。添加 all.names = TRUE 可将以 . 开头的名称也包括在内(默认隐藏)。返回的名称按字母顺序排列。
e <- new.env(parent = emptyenv())
e$b_val <- 2
e$a_val <- 1
e$.secret <- 'hidden'
cat('Default ls:', ls(envir = e), '\n')
cat('All names :', ls(envir = e, all.names = TRUE), '\n')带 inherits 的 exists()
exists('name', envir = e, inherits = FALSE) 只检查指定的环境,不检查其父环境。使用 inherits = TRUE(默认值)时,还会沿父环境链搜索。需要严格检查局部环境时,请使用 inherits = FALSE。
parent_e <- new.env(parent = emptyenv())
parent_e$shared <- 42
child_e <- new.env(parent = parent_e)
# inherits=TRUE: finds shared in parent
cat('inherits TRUE:', exists('shared', envir = child_e, inherits = TRUE), '\n')
# inherits=FALSE: only looks in child
cat('inherits FALSE:', exists('shared', envir = child_e, inherits = FALSE), '\n')environmentName() 与 parent.env()
environmentName(e) 会返回内置环境的名称(例如 'R_GlobalEnv'、'package:base' 等)。用户创建的环境会返回 ''。parent.env(e) 会返回父环境对象。
e <- new.env(parent = globalenv())
cat('Name of e :', environmentName(e), '\n')
cat('Parent of e :', environmentName(parent.env(e)), '\n')
cat('Name of global:', environmentName(globalenv()), '\n')环境的 $ 语法
环境支持使用 $ 和 [[ 语法读取和写入绑定,就像列表一样。当写入时名称已知时,这通常比使用 get()/assign() 直接访问更方便。
e <- new.env(parent = emptyenv())
e$pi_approx <- 3.14159
e[['e_approx']] <- 2.71828
cat('pi:', e$pi_approx, '\n')
cat('e :', e[['e_approx']], '\n')在指定环境中使用 rm()
rm('name', envir = e) 会从指定环境中删除一个绑定。这不同于删除全局变量——处理自定义环境时,必须明确指定环境。
e <- new.env(parent = emptyenv())
e$keep <- 1
e$remove_me <- 99
cat('Before:', ls(envir = e), '\n')
rm('remove_me', envir = e)
cat('After :', ls(envir = e), '\n')使用 as.list() 导出环境
as.list(e) 会将环境中的所有绑定转换为一个带名称的列表,便于检查或序列化其内容。结果是一个快照——之后对环境所做的更改不会反映到该列表中。
e <- new.env(parent = emptyenv())
e$x <- 10
e$y <- 20
e$z <- 30
bindings <- as.list(e)
cat('Class:', class(bindings), '\n')
cat('Length:', length(bindings), '\n')
str(bindings)将环境用作哈希表
在 new.env() 中使用 hash = TRUE 选项(设置了父环境时的默认值)可启用基于哈希的查找,使名称查找达到 O(1) 的复杂度。对于键值存储,这使大型环境的速度远快于列表。
# Build a small key-value store
store <- new.env(hash = TRUE, parent = emptyenv())
keys <- paste0('key_', 1:5)
values <- c(10, 20, 30, 40, 50)
for (i in seq_along(keys)) assign(keys[i], values[i], envir = store)
# Retrieve
cat('key_3 =', get('key_3', envir = store), '\n')
cat('All keys:', ls(store), '\n')环境的复制与共享
将环境赋值给新变量并不会复制它——两个变量都引用同一个对象。如果需要彼此独立的环境,请先使用 as.list(),再使用 list2env() 来创建真正的副本。
e1 <- new.env(parent = emptyenv())
e1$val <- 100
e2 <- e1 # reference, not a copy
e2$val <- 999
cat('e1$val:', e1$val, '\n') # 999, modified via e2!
# True copy:
e3 <- list2env(as.list(e1), parent = emptyenv())
e3$val <- 0
cat('e1$val after e3 change:', e1$val, '\n') # still 999快速检查
哪个函数可以检查名称是否绑定在某个环境中,而不搜索其父环境?
创建环境:要点总结
创建和检查环境的要点:
new.env(parent=e)创建新的空环境;对于大型存储,请使用hash=TRUE- 使用
assign('x', v, envir=e)和get('x', envir=e)以编程方式访问 e$x和e[['x']]的用法类似于列表访问器ls(envir=e)列出名称;使用exists('x', envir=e, inherits=FALSE)进行严格检查as.list(e)将环境导出为列表;list2env()将其重建为环境- 环境是引用对象——赋值会共享对象,而不是复制对象
config <- new.env(hash = TRUE, parent = emptyenv())
assign('host', 'localhost', envir = config)
assign('port', 5432L, envir = config)
assign('db', 'mydb', envir = config)
cat('Keys :', ls(config), '\n')
cat('host :', config$host, '\n')
cat('port :', config$port, '\n')用 AI 导师学习 R — 免费
在浏览器中编写并运行真实代码,获得全天候 AI 导师的即时帮助,并在网页或应用中继续学习。
- 课程
- 43
- 课程
- 159
常见问题解答
「创建并检查环境」课时是免费的吗?
是的 — 「创建并检查环境」的完整文本可在网页上免费阅读。要进行交互式练习(内置代码编辑器和全天候 AI 导师)并解锁 R Academy 课程的其余内容,请升级到 CoddyKit PRO。 R Academy 课程共包含 4 节课。
「创建并检查环境」这节课中我会学到什么?
使用 new.env()、environment()、ls() 和 get() 操作环境 你通过在浏览器中直接运行的动手代码来练习 R Academy,全天候 AI 导师会在你学习这节课的过程中回答你的问题。
学习 R Academy 需要有经验吗?
无需任何先前经验。CoddyKit 上的 R Academy 课程适合初学者到高级学习者,你可以从这里开始或从头开始,按照自己的节奏学习。 这是第 4 节课,共 4 节。
「创建并检查环境」课时需要多长时间?
大多数 CoddyKit 课程大约需要 5–10 分钟。每节课都很精短且互动,所以你能稳步进步,并在网页和应用中从离开的地方继续。
我能在这节 R Academy 课中编写并运行代码吗?
能。每节 R Academy 课都包含内置代码编辑器,你可以在浏览器中直接编写并运行真实代码,并获得即时 AI 反馈 — 无需本地设置。
此课程中的所有课时
- R 中的环境是什么
- 词法作用域规则
- 全局作用域与局部作用域
- 创建并检查环境