我有一个在示例fn_example_1
中调用的函数,该函数需要使用另一个函数(n
)的参数进行更改。
例如,它需要有一个永远不变的固定部分和一个用n
变长的可变部分:
# this is the function that needs to change
fn_example_1 <- function(x, mod) {
# -- this part is fixed
mod$a <- x^2 # fixed
# -- this part can change with n
mod$b[5,5, k] <- x + 1 # variable
mod$b[6, 6, k] <- x + 1 # variable
# mod$b[7,7, k] <- x + 1 # if n = 3 ecc..
# k is an arg from a third function, more on that later..
mod
}
这就是我的构想,基本上是一个包装函数,它返回fn_example_1
上的另一版本的n
。
fn_wrap_example <- function(fn, n) {
# something
# something
# I've thought about a long if else, of course with a max value for n.
return(fn)
}
fn_wrap_example(fn_example_1, n = 2) # call to the wrapper
至关重要的是fn_wrap_example
返回一个函数,这将是第三个函数的参数。为了简化起见,n
可以具有最大值,即:20。
关键是fn_example_1
是随n
改变的函数。
答案 0 :(得分:1)
以下是您可以在包装器中修改函数的方法:
fn_factory <- function(n) {
fn <- function(x, mod) {
# -- this part is fixed
mod$a <- x^2 # fixed
x #place holder
# k is an arg from a third function, more on that later..
mod
}
ins <- switch(n,
"1" = quote(mod$b[5,5, k] <- x + 1),
"2" = quote(mod$b[6, 6, k] <- x + 1)
)
body(fn)[[3]] <- ins
return(fn)
}
fn_factory(2)
#function (x, mod)
#{
# mod$a <- x^2
# mod$b[6, 6, k] <- x + 1
# mod
#}
#<environment: 0x0000000008334eb8>
我严重怀疑您是否需要这样做,但是当然可以做到。
答案 1 :(得分:0)
您正在寻找的被称为闭包。
https://www.r-bloggers.com/closures-in-r-a-useful-abstraction/
http://adv-r.had.co.nz/Functional-programming.html
简单的例子:
power <- function(exponent) {
function(x) {
x ^ exponent
}
}
square <- power(2)
square(2)