📅  最后修改于: 2023-12-03 15:04:46.266000             🧑  作者: Mango
词法作用域是一种变量作用域的规则,指的是变量作用状态由代码的语法结构来决定,而不是由程序运行时的控制流来决定。在词法作用域中,变量的作用域关系仅仅依赖于代码的嵌套结构,与程序的实际执行情况无关。
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
。其中的 <<-
符号是赋值符号,它表示的是修改自由变量的值。在执行过程中,myfun1
和 myfun2
都访问了自由变量 x
,并对其进行了修改。但由于词法作用域的不同,myfun1
和 myfun2
修改的是不同的 x
。
词法作用域是一种变量作用域的规则,它指的是变量的作用状态由代码的语法结构来决定。在 R 编程中,每一个函数都有自己的词法作用域。在函数中定义的变量,其作用域仅限于该函数中。词法作用域还可以用来创建闭包,闭包是指函数对象与其自由变量所组成的封闭集合。