r - <- 和 <<- 之间的区别

标签 r lexical-scope

案例 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 的变量的 first 范围.在这种情况下,fun2() 之外的唯一范围是全局作用域,所以它在那里进行赋值。

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

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

相关文章:

C: 不能在 if 语句中声明指针

javascript - 使用 Babel.js 将 ES6 箭头函数编译为 Es5

Ruby - 词法范围与继承

r - 循环以根据 R 中的其他情况创建新变量(非常基本)

r - sparklyr::sdf_quantile() 错误

r - 如何保存使用 rhandsontable r 包所做的编辑

function - emacs lisp 是否支持在词法上重新定义函数?

R:dplyr代表什么

r - 如何从 R 中现有的(字符)向量创建两个向量?

raku - 为什么 temp 在 Perl 6 核心设置中不起作用?