I’m sure there’s already an answer to it, but I’m not sure about the right terms to search for.
I thought that in R, functions that need an argument that is not defined in the function will look for said argument in the environment they are called from / the parent environment, no?
So I thought, the following would work:
f_xyz <- function (y, z)
{
x + y + z
}
f_x <- function()
{
x <- 1
y <- 2
z <- 3
f_xyz(y, z)
}
f_x()
x is defined and created in the f_x function, so when calling the f_xyz function WITHIN f_x, I thought it will find x there and use it. However, that is not the case. Instead I’m getting an error Error in f_xyz(y, z) : object 'x' not found.
If I create the f_xyz function in f_x, the error doesn’t appear.
What am I missing?
f_x <- function()
{
f_xyz <- function (y, z)
{x + y + z}
x <- 1
y <- 2
z <- 3
f_xyz(y, z)
}
f_x()
[1] 6
>Solution :
R uses lexical scoping:
the values of free variables are searched for in the environment in which the function was defined.
Function f_xyz was defined in the global env, but x was defined in the env of f_x, resulting in the error ‘object not found’. In the latter case, both f_xyz and x were defined in the same scope, so they can share their arguments.
Other languages like Python use enclosing scopes for nested functions, but R doesn’t.
See here for details.
Nevertheless, you probably want to use partial evaluation to set some arguments and mention x explicitly in the function. It is very messy to write a function relying on something else than its arguments.