This question already has answers here:
How do you use “<<-” (scoping assignment) in R?
(6 个回答)
5年前关闭。
情况1:
案例2:
我读到
在函数
因为函数
正如一些人已经评论过的,
(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