R Academy · 课时

创建并检查环境

使用 new.env()、environment()、ls() 和 get() 操作环境

第 4 / 4 课13 个步骤

创建并检查环境 是 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 反馈 — 无需本地设置。

此课程中的所有课时

  1. R 中的环境是什么
  2. 词法作用域规则
  3. 全局作用域与局部作用域
  4. 创建并检查环境
← 返回 R Academy