自动分配

时间:2016-09-06 14:44:27

标签: r variable-assignment

最近我一直在处理一组我从同事那里继承的R脚本。这对我来说是一个值得信赖的来源,但我不止一次在他的代码中找到自动分配,如

x <<- x

这样的操作是否有任何意义?

4 个答案:

答案 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总结得很好:“超级对齐的好用是与词法范围相结合,其中一个环境为一个函数或一组函数存储状态,通过使用超对齐来修改状态。”