Follow

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use
Contact

How to use object from another function in a function without explicitely passing it to the function

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:

MEDevel.com: Open-source for Healthcare and Education

Collecting and validating open-source software for healthcare, education, enterprise, development, medical imaging, medical records, and digital pathology.

Visit Medevel

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.

Add a comment

Leave a Reply

Keep Up to Date with the Most Important News

By pressing the Subscribe button, you confirm that you have read and are agreeing to our Privacy Policy and Terms of Use

Discover more from Dev solutions

Subscribe now to keep reading and get access to the full archive.

Continue reading