R中的assign()和<< - 有什么区别?

Mil*_*der 14 functional-programming r global-variables

在R中编写函数的常规方法(据我所知)是为了避免副作用并从函数返回一个值.

contained <- function(x) {
  x_squared <- x^2
  return(x_squared)
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,返回从函数输入计算的值.但是变量x_squared不可用.

但是如果你需要违反这个基本的函数式编程原则(我不确定R对这个问题有多严重)并从函数中返回一个对象,你有两个选择.

escape <- function(x){
  x_squared  <<- x^2
  assign("x_times_x", x*x, envir = .GlobalEnv)
}
Run Code Online (Sandbox Code Playgroud)

这两个对象x_squared,并x_times_x返回.一种方法比另一种方法更好,为什么呢?

Dir*_*tel 18

托马斯·拉姆利在前一天的r-help上发表了精彩的帖子.<<-是关于封闭的环境,所以你可以做这样的事情(再次,我引用他的帖子从4月22日在这个线程):

make.accumulator<-function(){
    a <- 0
    function(x) {
        a <<- a + x
        a
    }
}

> f<-make.accumulator()
> f(1)
[1] 1
> f(1)
[1] 2
> f(11)
[1] 13
> f(11)
[1] 24
Run Code Online (Sandbox Code Playgroud)

这是<<-具有词法范围的"超级赋值" 的合法用法.而不仅仅是在全球环境中分配.为此,托马斯有这些选择词:

邪恶和错误的用法是修改全局环境中的变量.

非常好的建议.