Search code examples
rfunctional-programming

Function that returns function with argument


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.


Solution

  • 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