对于此代码:
'\r'
以下是输出:
A <- 100; B <- 20
f1 <- function(a) {
B <- 100
f2 <- function(b) {
A <<- 200
B <<- 1000
}
f2(a)
}
f1(B)
cat(A)
cat(B)
以下是我对上述代码的理解: 使用具有值20的参数B调用函数f1。在f1内创建局部变量B(B <-100),f1.B对变量B没有影响。 初始化外部函数调用f1作为f1.B局部作用于函数f1。在f1中创建一个新函数f2,它接受单个参数b。 在f1内,调用函数f2作为参数a传递给f2。 f2没有使用它的参数b。 f2使用全局运算符&lt; - 修改A并将其设置为200.这 为什么cat(A)输出200。
我的理解是不正确的,因为当我期望1000时B被设置为20?使用&lt; - 在A中将A设置为200。对于B,不应该出现同样的情况吗?
答案 0 :(得分:5)
使用值为20的参数B调用函数f1。
不,我不这么认为。它使用参数a
调用,该参数与全局环境中的B
具有相同的值。 B
并未直接涉及这一点。
然后,您将100分配给另一个B
,您在帖子中调用f1.B
。 (请注意,按照前面的说法,此处创建B
,而不是覆盖。)
然后,当使用<<-
运算符时,它会在范围内遍历,从f2
(不存在B
)到f1
,在此处找到&# 34; f1.B
&#34;并指定1000。
同样,在<<-
上使用A
时,它会向上移动。它在A
或f2
中找不到f1
,但在全局环境中找到它并将其分配到那里。
然后打印到原始B
,原来从未被修改过。
来自帮助:
<<-
和->>
(...)导致通过父环境进行搜索,以查找变量的现有定义 分配。如果找到这样的变量(并且其绑定未锁定) 然后重新定义它的值,否则赋值发生在 全球环境。
因此对于B
,&#34;找到这样的变量&#34; ,而对于A
&#34;分配发生在全球环境。&#34;
结论: <<-
令人困惑,通常最好避免使用。