严格来说,作用域分配 <<- 分配给父环境还是全局环境?
Strictly speaking does the scoping assignment <<- assign to the parent environment or global environment?
通常父环境是全局环境。
但有时并非如此。例如在函数中的函数中,或在 tryCatch()
中的错误函数中。
严格来说,<<-
是分配给全局环境,还是仅仅分配给父环境?
试试看:
env = new.env()
env2 = new.env(parent = env)
local(x <<- 42, env2)
ls(env)
# character(0)
ls()
# [1] "env" "env2" "x"
但是:
env$x = 1
local(x <<- 2, env2)
env$x
# [1] 2
…所以 <<-
确实 遍历父环境的整个链,直到找到给定名称的现有对象并将其替换。但是,如果它没有找到任何这样的对象,它会在 .GlobalEnv
.
中创建一个新对象
(The documentation 陈述大致相同。但在这种情况下,没有什么比通过实验获得更好的理解更好的了。)
根据文档:
The operators <<-
and ->>
are normally only used in functions, and cause a search to be made through parent environments for an existing definition of the variable being assigned.
使用此运算符将导致 R 搜索环境树,直到找到匹配项。搜索从使用运算符的环境开始,并从那里向上移动堆栈。所以它不能保证是 "global" 赋值,但 可以 是。
正如 sindri_baldur 指出的那样,如果在任何现有环境中都找不到该变量,则会在全局级别创建一个新变量。
最后,我要指出的是,运算符的使用往往令人困惑,而不是有用,因为它打破了 R 编程原本高度函数化的本质。很可能有一种方法可以避免使用 <<-
.
通常父环境是全局环境。
但有时并非如此。例如在函数中的函数中,或在 tryCatch()
中的错误函数中。
严格来说,<<-
是分配给全局环境,还是仅仅分配给父环境?
试试看:
env = new.env()
env2 = new.env(parent = env)
local(x <<- 42, env2)
ls(env)
# character(0)
ls()
# [1] "env" "env2" "x"
但是:
env$x = 1
local(x <<- 2, env2)
env$x
# [1] 2
…所以 <<-
确实 遍历父环境的整个链,直到找到给定名称的现有对象并将其替换。但是,如果它没有找到任何这样的对象,它会在 .GlobalEnv
.
(The documentation 陈述大致相同。但在这种情况下,没有什么比通过实验获得更好的理解更好的了。)
根据文档:
The operators
<<-
and->>
are normally only used in functions, and cause a search to be made through parent environments for an existing definition of the variable being assigned.
使用此运算符将导致 R 搜索环境树,直到找到匹配项。搜索从使用运算符的环境开始,并从那里向上移动堆栈。所以它不能保证是 "global" 赋值,但 可以 是。
正如 sindri_baldur 指出的那样,如果在任何现有环境中都找不到该变量,则会在全局级别创建一个新变量。
最后,我要指出的是,运算符的使用往往令人困惑,而不是有用,因为它打破了 R 编程原本高度函数化的本质。很可能有一种方法可以避免使用 <<-
.