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