![](/img/trans.png)
[英]Can someone explain the order of arguments for %in% in R software?
[英]Can someone explain the behaviour of `<<-` assignament operator in R?
几个小时后,我在代码中发现了一个错误,因为r中的<<-
assinament运算符的意外行为。 我已经阅读了文档并浏览了Internet,但是我仍然不了解操作员的行为。
查看以下两个功能:
# Define a function a_counter
a_counter <- function(){
i <<- i + 1
print(i)
}
> i <- 0
> a_counter()
[1] 1
> print(i)
[1] 1
> a_counter()
[1] 2
> print(i)
[1] 2
# Define a function not_a_counter
not_a_counter <- function(){
i <- 0
i <<- i + 1
print(i)
}
> i <- 0
> not_a_counter()
[1] 0
> print(i)
[1] 1
> not_a_counter()
[1] 0
> print(i)
[1] 1
第一部分代码按我的预期运行,在每个环境调用(函数环境和全局环境)中的变量i
都增加了。
第二段代码对我来说绝对是意外的。 在i <<- i + 1
不分配值到i
所在的功能环境,但在这样做, i
位于全球环境。 我希望两个环境都可以更新。
在您的a_counter
,只有i
一个值。 不是两个。 当在函数中找到“自由变量”时,将在定义该函数的环境中对其进行查找。 因此,当您在该函数中调用i
时,它将取决于全局环境以查找值。 然后,当您执行<<-
,函数环境中根本不会发生分配。 <<-
总是开始在父环境中查找。 如果你看
counter_vars <- function() {
a <- 4
i <<- i + 1
ls()
}
counter_vars()
# [1] "a"
您会看到函数环境/闭包内部的唯一变量是a
变量。 i
变量在那里不存在。 因此,与原来的功能全部i
š来自全球范围内
a_counter <- function(){
i <<- i + 1 # global i = global i + 1
print(i) # global i still (no local variable has been created)
}
所以应该在not_a_counter
看到您的行为,因为<<-
不会在当前环境中更改值。 它总是开始寻找一个“向上”的环境。 当你有
not_a_counter <- function(){
i <- 0 # local i (always 0)
i <<- i + 1 # global i == local i + 1 (always 0+1)
print(i) # local i (always still 0, local value not changed)
}
在函数中定义后, i
变量不再“空闲”。 所以i <- 0
创建一个局部变量,在i <<- i + 1
一部分,右边i+1
使用该本地变量并分配给i
在父环境。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.