返回带有参数的函数的函数

Maë*_*aël 4 functional-programming r

创建一个应返回包含原始函数参数的函数时,我应该如何处理?

例如考虑这个函数:

a <- function(value){
  function(x) x + value
}
Run Code Online (Sandbox Code Playgroud)

我希望它返回我在结果函数的参数中指定的值,如下所示:

b <- a(3)
#> b
#> function(x) x + 3
Run Code Online (Sandbox Code Playgroud)

之后就能够使用结果函数b

b(2)
#[1] 5
Run Code Online (Sandbox Code Playgroud)

相反,我得到:

> b
function(x) x + value
<environment: 0x000002254f80a758>
Run Code Online (Sandbox Code Playgroud)

我尝试过使用substitute, eval, parse...但我有点困惑。优选碱R溶液。

G. *_*eck 5

正如我在评论中讨论的那样,问题中显示的函数已经可以工作,因此实际上并不需要下面的方法,但如果您想创建一个具有硬编码值的函数,value那么可以使用其中之一。没有使用任何包。

1) do.call/替换

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())
Run Code Online (Sandbox Code Playgroud)

给予:

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

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

[[3]]
function (x) 
x + 3L
Run Code Online (Sandbox Code Playgroud)

2) 字符串另一种可能性是使用字符串替换:

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

lapply(1:3, a2, envir = environment())
Run Code Online (Sandbox Code Playgroud)

给予:

[[1]]
function(x) x + 1

[[2]]
function(x) x + 2

[[3]]
function(x) x + 3
Run Code Online (Sandbox Code Playgroud)