This question already has answers here:
How do you use “<<-” (scoping assignment) in R?

(6 个回答)


5年前关闭。




情况1:
rm(list = ls())
foo <- function(x = 6){
  set <- function(){
  x <- x*x}
  set()
x}
foo()
# [1] 6

案例2:
rm(list = ls())
foo <- function(x = 6){
set <- function(){
  x <<- x*x}
  set()
  x}
foo()
# [1] 36

我读到 <<- 运算符可用于为与当前环境不同的环境中的对象赋值。它说可以对不在当前环境中的对象使用 <<- 进行对象初始化。我想问一下可以使用 <<- 初始化哪个环境的对象。在我的情况下,环境是 foo 函数的环境,<<- 是否可以初始化函数外部的对象或当前环境中的对象?完全混淆何时使用 <- 和何时使用 <<-

最佳答案

运算符 <<- 是父作用域赋值运算符。它用于对最接近其评估范围的父作用域中的变量进行赋值。因此,这些赋值“粘”在函数调用之外的范围内。考虑以下代码:

fun1 <- function() {
    x <- 10
    print(x)
}

> x <- 5    # x is defined in the outer (global) scope
> fun1()
[1] 10      # x was assigned to 10 in fun1()
> x
[1] 5       # but the global value of x is unchanged

在函数 fun1() 中,局部变量 x 被赋值为 10 ,但在全局范围内, x 的值没有改变。现在考虑重写函数以使用父作用域赋值运算符:
fun2 <- function() {
    x <<- 10
    print(x)
}

> x <- 5
> fun2()
[1] 10      # x was assigned to 10 in fun2()
> x
[1] 10      # the global value of x changed to 10

因为函数 fun2() 使用了 <<- 运算符,所以在函数完成评估后,x 的赋值会“保持不变”。 R 实际所做的是遍历 fun2() 之外的所有作用域并查找包含名为 x 的变量的第一个作用域。在这种情况下,fun2() 之外的唯一作用域是全局作用域,因此它在那里进行赋值。

正如一些人已经评论过的,<<- 操作符被许多人反对,因为它会破坏 R 脚本的封装。如果我们将 R 函数视为一个孤立的功能块,则不应允许它干扰调用它的代码的状态。滥用 <<- 赋值运算符会冒着这样做的风险。

关于r - <- 和 <<- 之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/32623856/

10-12 01:00