R语言变量作用域 #
一、作用域概述 #
作用域定义了变量的可见范围,R语言使用词法作用域(Lexical Scoping)。
二、全局变量 #
2.1 定义全局变量 #
r
x <- 10
my_func <- function() {
print(x)
}
my_func()
2.2 修改全局变量 #
r
x <- 10
my_func <- function() {
x <<- 20
}
my_func()
print(x)
2.3 globalenv #
r
x <- 10
my_func <- function() {
assign("y", 20, envir = globalenv())
}
my_func()
print(y)
三、局部变量 #
3.1 函数内变量 #
r
my_func <- function() {
local_var <- 10
print(local_var)
}
my_func()
print(local_var)
3.2 参数变量 #
r
my_func <- function(x) {
print(x)
x <- 20
print(x)
}
my_func(10)
3.3 局部环境 #
r
my_func <- function() {
local({
x <- 10
print(x)
})
print(x)
}
my_func()
四、作用域规则 #
4.1 词法作用域 #
r
x <- 10
outer_func <- function() {
x <- 20
inner_func <- function() {
print(x)
}
inner_func()
}
outer_func()
4.2 查找顺序 #
r
x <- 10
my_func <- function() {
x <- 20
print(x)
}
my_func()
print(x)
4.3 嵌套函数 #
r
outer <- function() {
x <- "outer"
inner <- function() {
y <- "inner"
print(x)
print(y)
}
inner()
print(x)
print(y)
}
outer()
五、<<- 运算符 #
5.1 超赋值运算符 #
r
x <- 10
my_func <- function() {
x <<- 20
}
my_func()
print(x)
5.2 在闭包中使用 #
r
make_counter <- function() {
count <- 0
function() {
count <<- count + 1
count
}
}
counter <- make_counter()
counter()
counter()
counter()
5.3 注意事项 #
r
x <- 10
my_func <- function() {
x <- 5
x <<- 20
print(paste("函数内:", x))
}
my_func()
print(paste("函数外:", x))
六、环境 #
6.1 环境基础 #
r
env <- new.env()
env$x <- 10
env$y <- 20
env$x
ls(env)
6.2 环境层级 #
r
parent_env <- new.env()
parent_env$a <- 1
child_env <- new.env(parent = parent_env)
child_env$b <- 2
child_env$a
child_env$b
6.3 环境函数 #
r
env <- new.env()
env$x <- 10
ls(env)
exists("x", envir = env)
get("x", envir = env)
assign("y", 20, envir = env)
七、闭包 #
7.1 基本闭包 #
r
make_adder <- function(x) {
function(y) {
x + y
}
}
add5 <- make_adder(5)
add10 <- make_adder(10)
add5(3)
add10(3)
7.2 状态保持 #
r
make_counter <- function() {
count <- 0
list(
increment = function() {
count <<- count + 1
count
},
decrement = function() {
count <<- count - 1
count
},
get = function() count
)
}
counter <- make_counter()
counter$increment()
counter$increment()
counter$get()
7.3 配置管理 #
r
make_config <- function() {
config <- list()
list(
set = function(key, value) {
config[[key]] <<- value
},
get = function(key) {
config[[key]]
},
list_all = function() {
config
}
)
}
cfg <- make_config()
cfg$set("host", "localhost")
cfg$set("port", 8080)
cfg$list_all()
八、实践示例 #
8.1 模块模式 #
r
make_bank_account <- function(initial_balance) {
balance <- initial_balance
list(
deposit = function(amount) {
balance <<- balance + amount
balance
},
withdraw = function(amount) {
if (amount > balance) {
stop("余额不足")
}
balance <<- balance - amount
balance
},
get_balance = function() {
balance
}
)
}
account <- make_bank_account(100)
account$deposit(50)
account$withdraw(30)
account$get_balance()
8.2 缓存函数 #
r
make_cached <- function(f) {
cache <- new.env()
function(x) {
key <- as.character(x)
if (exists(key, envir = cache)) {
return(get(key, envir = cache))
}
result <- f(x)
assign(key, result, envir = cache)
result
}
}
slow_func <- function(x) {
Sys.sleep(0.1)
x ^ 2
}
cached_func <- make_cached(slow_func)
system.time(cached_func(5))
system.time(cached_func(5))
九、总结 #
本章学习了:
- 全局变量和局部变量
- 词法作用域规则
- <<- 超赋值运算符
- 环境的使用
- 闭包的创建和应用
理解作用域是编写复杂R程序的基础!
最后更新:2026-03-27