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溶液。
正如我在评论中讨论的那样,问题中显示的函数已经可以工作,因此实际上并不需要下面的方法,但如果您想创建一个具有硬编码值的函数,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)