最近我一直在处理一组我从同事那里继承的R脚本。这对我来说是一个值得信赖的来源,但我不止一次在他的代码中找到自动分配,如
x <<- x
这样的操作是否有任何意义?
答案 0 :(得分:4)
这是一种机制,用于将函数中定义的值复制到全局环境中(或至少在环境父级堆栈中的某个位置):来自?"<<-"
运算符'&lt;&lt; - '和' - &gt;&gt;'通常仅用于函数, 并导致通过父环境进行搜索 已分配变量的现有定义。如果这样的话 找到变量(并且它的绑定没有被锁定)然后是它的值 被重新定义,否则分配发生在全球 环境。
我不认为这是一种特别好的做法(R是一种功能最强大的语言,并且通常更好地避免功能副作用),但它确实做了些什么。 ( @Roland在评论中指出和@BrianO&Donnell在他的回答中[引用Thomas Lumley]如果您正在使用它,使用<<-
是的良好做法修改一个函数闭包,就像demo(scoping)
一样。根据我的经验,构造全局变量比使用函数闭包干净利用更常被误用。)
考虑这个例子,从空/干净的环境开始:
f <- function() {
x <- 1 ## assignment
x <<- x ## global assignment
}
在我们致电f()
之前:
x
## Error: object 'x' not found
现在请致电f()
然后重试:
f()
x
## [1] 1
答案 1 :(得分:1)
<<-
是一个全局赋值运算符,我认为应该几乎没有理由使用它,因为它会有效地引起副作用。
当任何人想要从当前环境定义全局变量或变量一级时,使用它的范围将是任何情况。
答案 2 :(得分:1)
例如:
x <- NA
test <- function(x) {
x <<- x
}
> test(5)
> x
#[1] 5
这是一个简单的用法,<<-
将进行父环境搜索(嵌套函数声明的情况),如果没有在全局环境中找到assign。
通常这是一个非常糟糕的主意 TM ,因为你无法真正控制变量的分配位置,并且你有机会覆盖某个用于其他目的的变量。
答案 3 :(得分:1)
Alan给出了一个很好的答案:Use the superassignment operator <<- to write upstairs。
哈德利也给出了一个很好的答案:How do you use "<<-" (scoping assignment) in R?。
有关“超级对齐”运算符的详细信息,请参阅Scope。
以下是有关操作员的一些重要信息,请参阅R手册中的Assignment Operators部分:
“运算符&lt;&lt; - 和 - &gt;&gt;通常仅在函数中使用,并导致通过父环境进行搜索,以查找所分配变量的现有定义。如果找到此类变量(并且它的绑定没有被锁定)然后重新定义它的值,否则赋值发生在全局环境中。“
Thomas Lumley总结得很好:“超级对齐的好用是与词法范围相结合,其中一个环境为一个函数或一组函数存储状态,通过使用超对齐来修改状态。”