案例 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/