Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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.

like image 260
Maël Avatar asked Oct 26 '25 17:10

Maël


1 Answers

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
like image 112
G. Grothendieck Avatar answered Oct 28 '25 06:10

G. Grothendieck