R编程中的词法作用域与动态作用域
R 是一种开源编程语言,被广泛用作统计软件和数据分析工具。 R 通常带有命令行界面。 R 可在 Windows、Linux 和 macOS 等广泛使用的平台上使用。此外,R 编程语言是最新的尖端工具。语言的范围规则负责确定值如何与 R 语言函数中的自由变量相关联。
词法作用域
在词法作用域中,变量的范围由程序的文本结构决定。我们今天使用的大多数编程语言都是词法范围的。甚至,人类只需正确阅读代码即可确定变量的范围。下面是 R 中的词法范围代码。
Python3
# R program to depict scoping
# Assign a value to a
a <- 1
# Defining function b and c
b <- function() a
c <- function(){
a <- 2
b()
}
# Call to function c
c()
Python3
# R program to depict scoping
# Assign a value to a
a <- 1
# Defining function b and c
b <- function() a
c <- function(){
a <- 2
b()
}
# Call to function c
c()
Python3
# R program to depict scoping
# Assign a value to a
a <- 10
# Defining function f
f <- function(x) {
a <- 2
a ^ 2 + g(x)
}
# Defining function g
g <- function(x) {
x * a
}
# Call to function f
f(3)
输出:
1
在此示例中,首先创建 a 的映射。在下一行中,定义了一个函数b,它返回一些 a 的值。在第 3 行,我们定义了一个函数c,它为 a 创建一个新映射,然后调用 b。请注意,第 4 行的赋值不会更新第 1 行的定义,并且在输出值中返回 1。
动态范围
在动态范围中,变量采用分配给该变量的最新值的值
在这里,考虑与上述相同的示例。
Python3
# R program to depict scoping
# Assign a value to a
a <- 1
# Defining function b and c
b <- function() a
c <- function(){
a <- 2
b()
}
# Call to function c
c()
输出:
1
根据 Dynamic 的规则,这段代码的输出应该是 2,因为分配给变量 a 的最新值是 2。
R 语言中的作用域
有时,在 R 语言中,代码会出现动态作用域的外观,这种情况发生在函数在全局环境中定义并从全局环境中调用时,导致定义和调用环境的环境相同,可以在示例中描述下面给出。
Python3
# R program to depict scoping
# Assign a value to a
a <- 10
# Defining function f
f <- function(x) {
a <- 2
a ^ 2 + g(x)
}
# Defining function g
g <- function(x) {
x * a
}
# Call to function f
f(3)
输出:
34
在此示例中,在定义它的环境中查找 g,因此 a 的值为 10。使用动态范围,在调用它的环境中查找变量的值。在 R 中,该环境被称为父环境,因此在函数f 中,a 的值为 2,而在 g 中,该值为 10。这可能会造成 R 语言是动态语言的错觉,但实际上,结果是是词法作用域语言。以下是 R 编程中词法和动态范围之间的一些区别。
词法作用域和动态作用域之间的区别
Lexical | Dynamic |
---|---|
In this variable refers to top level environment | In this variable is associated to most recent environment |
It is easy to find the scope by reading the code | In this programmer has to anticipate all possible contexts |
It is dependent on how code is written | It is dependent on how code is executed |
Structure of program defines which variable is referred to. | Runtime state of program stack determines the variable. |
It is property of program text and unrelated to real time stack. | It is dependent on real time stack rather than program text |
It provides less flexibility | It provides more flexibility |
Accessing to nonlocal variables in lexical scoping is fast. | Accessing to nonlocal variables in dynamic scoping takes more time. |
Local variables can be protected to be accessed by local variables. | There is no way to protect local variables to be accessed by subprograms. |