Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Strictly speaking does the scoping assignment <<- assign to the parent environment or global environment?

Often the parent environment is the global environment.

But occasionally it isn't. For example in functions within functions, or in an error function in tryCatch().

Strictly speaking, does <<- assign to the global environment, or simply to the parent environment?

like image 602
stevec Avatar asked Dec 11 '22 03:12

stevec


2 Answers

Try it out:

env = new.env()
env2 = new.env(parent = env)

local(x <<- 42, env2)
ls(env)
# character(0)
ls()
# [1] "env"  "env2" "x"

But:

env$x = 1
local(x <<- 2, env2)
env$x
# [1] 2

… so <<- does walk up the entire chain of parent environments until it finds an existing object of the given name, and replaces that. However, if it doesn’t find any such object, it creates a new object in .GlobalEnv.

(The documentation states much the same. But in a case such as this nothing beats experimenting to gain a better understanding.)

like image 108
Konrad Rudolph Avatar answered Jan 19 '23 00:01

Konrad Rudolph


Per 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.

Use of this operator will cause R to search through the environment tree until it finds a match. The search starts at the environment in which the operator is used and moves up the stack from there. So it's not guaranteed to be a "global" assignment, but could be.

As sindri_baldur points out, if the variable is not found in any existing environment, a new one will be created at the global level.

Lastly, I should point out that use of the operator is confusing more often than it is helpful, as it breaks the otherwise highly functional nature of R programming. There's more than likely a way to avoid using <<-.

like image 25
jdobres Avatar answered Jan 18 '23 23:01

jdobres