Search code examples
rnested

In R, how to pass arguments from the parent to the child function?


I have two functions nested in another function and I would like that the arguments declared in parent were passed to the child (only when the argument is relevant to the function).

# child function 1
child_f1 <- function(x1 = 1, x2 = 3) {
  res <- x1^2 + 4 * x2
}

# child function 2
child_f2 <- function(z = 2) {
  res <- z * 1.345
}

# parent function
parent_f <- function(y = 4, ...) {
  res <- (child_f1(...) ^ y) + child_f2(...)
  # print(res)
  return(res)
}

Test below:

parent_f(y = 2, x1 = 2, x2 = 0, z = 3)
# Error in child_f1(...) (from #2) : unused argument (z = 3)

# Expected result:
(((2)^2 + 4*(0)) ^ (2)) + (3) * 1.345
[1] 20.04

How do I tell child_f1 that has to use only x1 and x2 (if available, otherwise use default value) and child_f2 that has to use only z(if available, otherwise use default value)?

I would like to stick with the usage of ... rather than re-write a parent_f() with all the possible parameters declared.


Solution

  • Add ... to each child to slurp up the unused arguments. parent_f is unchanged.

    child_f1 <- function(x1 = 1, x2 = 3, ...) {
      res <- x1^2 + 4 * x2
    }
    
    child_f2 <- function(z = 2, ...) {
      res <- z * 1.345
    }
    
    parent_f(y = 2, x1 = 2, x2 = 0, z = 3)
    ## [1] 20.035
    

    If you can't modify the children or the parent then use this:

    child_f1_orig <- child_f1
    child_f1 <- function(x1 = 1, x2 = 3, ...) child_f1_orig(x1 = x1, x2 = x2)
    
    child_f2_orig <- child_f2
    child_f2 <- function(z = 2, ...) child_f2_orig(z = z)
    
    parent_f(y = 2, x1 = 2, x2 = 0, z = 3)
    ## [1] 20.035