Home > Software engineering >  Function that returns function with argument
Function that returns function with argument

Time:01-05

How should I go about when creating a function that should return a function that includes an argument of the original function?

Consider for instance this function:

a <- function(value){
  function(x) x   value
}

I'd like it to return the value I specify in the parameter in the resulting function, like this:

b <- a(3)
#> b
#> function(x) x   3

And be able to use the resulting function b thereafter:

b(2)
#[1] 5

Instead, I get:

> b
function(x) x   value
<environment: 0x000002254f80a758>

I've tried using substitute, eval, parse... but I'm a bit confused. Preferably a base R solution.

CodePudding user response:

As I discussed in the comments the function shown in the question already works so the approaches below are not really needed but if you want to create a function with the value of value hard coded into it then one of these. No packages are used.

1) do.call/substitute

a <- function(value, envir = parent.frame()) {
  f <- function(x) x   value
  body(f) <- do.call("substitute", list(body(f), list(value = value)))
  environment(f) <- envir
  f
}

b <- a(3)
b
## function (x) 
## x   3

b(4)
## [1] 7

lapply(1:3, a, envir = environment())

giving:

[[1]]
function (x) 
x   1L

[[2]]
function (x) 
x   2L

[[3]]
function (x) 
x   3L

2) strings Another possibility is to use string substitution:

a2 <- function(value, envir = parent.frame()) {
  eval(parse(text = gsub("\\bvalue\\b", value, "function(x) x   value")), envir)
}

lapply(1:3, a2, envir = environment())

giving:

[[1]]
function(x) x   1

[[2]]
function(x) x   2

[[3]]
function(x) x   3
  • Related