📜  R 编程中的词法作用域(1)

📅  最后修改于: 2023-12-03 15:04:46.266000             🧑  作者: Mango

R 编程中的词法作用域

什么是词法作用域

词法作用域是一种变量作用域的规则,指的是变量作用状态由代码的语法结构来决定,而不是由程序运行时的控制流来决定。在词法作用域中,变量的作用域关系仅仅依赖于代码的嵌套结构,与程序的实际执行情况无关。

R 编程中的词法作用域

R 语言中,每一个函数都有自己的词法作用域。在函数中定义的变量,其作用域仅限于该函数中,与函数外的变量不会产生冲突。

myfun <- function() {
  x <- 1
  print(x)
}

x <- 2
myfun()
print(x)

输出结果为:

[1] 1
[1] 2

可以看到,在函数 myfun 中,定义了变量 x,其作用域仅限于该函数内部。当调用函数 myfun 时,输出了 x 的值为 1。而在 myfun 外部,又定义了变量 x,其作用域不同于 myfun 中的变量 x。当输出 x 的值时,输出结果为 2。

词法作用域中的闭包

词法作用域还可以用来创建闭包。闭包是指函数对象与其自由变量所组成的封闭集合。

在 R 中,可以通过返回函数对象来创建闭包。这个返回的函数对象可以访问并修改其词法作用域中的自由变量。

myclosure <- function() {
  x <- 1
  function() {
    x <<- x + 1
    print(x)
  }
}

myfun1 <- myclosure()
myfun2 <- myclosure()

myfun1()
myfun1()
myfun2()

输出结果为:

[1] 2
[1] 3
[1] 2

可以看到,当创建闭包时,函数 myclosure 中定义了变量 x。返回函数对象时,访问的是自由变量 x。其中的 <<- 符号是赋值符号,它表示的是修改自由变量的值。在执行过程中,myfun1myfun2 都访问了自由变量 x,并对其进行了修改。但由于词法作用域的不同,myfun1myfun2 修改的是不同的 x

总结

词法作用域是一种变量作用域的规则,它指的是变量的作用状态由代码的语法结构来决定。在 R 编程中,每一个函数都有自己的词法作用域。在函数中定义的变量,其作用域仅限于该函数中。词法作用域还可以用来创建闭包,闭包是指函数对象与其自由变量所组成的封闭集合。