我刚刚读完R 介绍中的范围界定 http://cran.r-project.org/doc/manuals/R-intro.html#Scope,并且我很好奇<<-
任务。
该手册展示了一个(非常有趣的)示例<<-
,我觉得我明白了。我仍然缺少的是它何时有用的背景。
因此,我很想从您那里读到有关何时使用的示例(或示例链接)<<-
可能很有趣/有用。使用它可能有什么危险(它看起来很容易被忽视),以及您可能想分享的任何提示。
<<-
与闭包结合使用以维持状态最有用。这是我最近一篇论文的一部分:
闭包是由另一个函数编写的函数。关闭是
所谓因为他们enclose父母的环境
函数,并且可以访问该函数中的所有变量和参数
功能。这很有用,因为它允许我们有两个级别
参数。一级参数(父级)控制如何
功能有效。另一个级别(子级)负责这项工作。这
下面的例子展示了如何使用这个想法来生成一个家族
幂函数。父函数 (power
) 创建子函数
(square
and cube
)实际上是在做艰苦的工作。
power <- function(exponent) {
function(x) x ^ exponent
}
square <- power(2)
square(2) # -> [1] 4
square(4) # -> [1] 16
cube <- power(3)
cube(2) # -> [1] 8
cube(4) # -> [1] 64
在两个级别管理变量的能力还可以通过允许函数修改其父环境中的变量来维护跨函数调用的状态。管理不同级别变量的关键是双箭头赋值运算符<<-
。与通常的单箭头分配不同(<-
)始终适用于当前级别,双箭头运算符可以修改父级别中的变量。
这使得可以维护一个记录函数被调用次数的计数器,如以下示例所示。每一次new_counter
运行时,它创建一个环境,初始化计数器i
在此环境中,然后创建一个新函数。
new_counter <- function() {
i <- 0
function() {
# do something useful, then ...
i <<- i + 1
i
}
}
新函数是一个闭包,它的环境是封闭环境。当关闭时counter_one
and counter_two
运行时,每个都会修改其封闭环境中的计数器,然后返回当前计数。
counter_one <- new_counter()
counter_two <- new_counter()
counter_one() # -> [1] 1
counter_one() # -> [1] 2
counter_two() # -> [1] 1
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)