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

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)?

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

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

>Solution :

We can use formals to reduce the arguments to those supported by the child function. This relies on all arguments being named, which is supported here. After that, we use do.call to programmatically call a function with a list of arguments.

# parent function
parent_f <- function(y = 4, ...) {
  dots <- list(...)
  dots1 <- dots[intersect(names(dots), names(formals(child_f1)))]
  dots2 <- dots[intersect(names(dots), names(formals(child_f2)))]
  res <- (do.call(child_f1, dots1) ^ y) + do.call(child_f2, dots2)
  # print(res)
  return(res)
}

parent_f(y = 2, x1 = 2, x2 = 0, z = 3)
# [1] 20.035
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