📜  R编程中的词法作用域与动态作用域

📅  最后修改于: 2022-05-13 01:54:57.538000             🧑  作者: Mango

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 编程中词法和动态范围之间的一些区别。

词法作用域和动态作用域之间的区别

LexicalDynamic
In this variable refers to top level environmentIn this variable is associated to most recent environment
It is easy to find the scope by reading the codeIn this programmer has to anticipate all possible contexts
It is dependent on how code is writtenIt 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 flexibilityIt 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.