---------------------------------- What is the output? -----------------------
y = "World!"
f = function(x) {
y = "Weird!"
g(x)
}
g = function(x) {
cat(x, y)
}
f("Hello")
> search()
[1] ".GlobalEnv" "package:RMySQL" "package:DBI"
[4] "tools:rstudio" "package:stats" "package:graphics"
[7] "package:grDevices" "package:utils" "package:datasets"
[10] "package:methods" "Autoloads" "package:base"
R, like Perl, Python and Lisp, is lexical(static) scoping. It searches for free variables in various environments with a specific order.
In this case, y is the free variable of function g(x).
The search order is:
1, The environment where g(x) is defined: Global environment
2, Parent environment (package, namespace, import)
3, Repeat 2 till it reaches the top level
4, Empty environment, error.
Empty environment has not parent.
Here is a function closure in R:
return( function(x) {
(a*x+c) %% m
})
}
my_runif=lcg(214013,2531011, 2^32)
my_runif(2)
A well known question: "Does all computer languages converge to LISP?"