我想在R中生成函数列表。基本上,我想生成f <- function(x){a*x}
形式的函数列表,其中我指定了a
值的向量。这可能吗?
或者是否可以指定a
的值然后让R解释已经评估过a
的函数?为了澄清,如果我指定a <- 2
,我是否可以让R将f
视为function(x){2*x}
而不是function(x){a*x}
?
答案 0 :(得分:4)
是的,你可以这样做。这是一个例子
a<-1:5
fn<-lapply(a, function(i) {
force(i)
function(x) {
x * i
}
})
fn[[1]](1)
fn[[5]](1)
唯一的&#34;技巧&#34;这是force()
函数。因为R使用惰性求值,所以在实际需要之前它不会解码i
值。如果你没有将force
放在那里,那么当你去使用一个函数时,它将最终解决i
而i
将只是它的最后一个值。 lapply
在这种情况下为5
。
答案 1 :(得分:2)
这样的事情也可能很方便。您可以使用body
和get
> f <- function(x) a*x
> f
function(x) a*x
> a <- 2
> body(f)[[2]] <- get('a')
> f
function (x)
2 * x
> f(1:5)
# [1] 2 4 6 8 10
函数的主体是一个列表,它的元素可以像任何其他列表一样被访问。
> body(f)
2 * x
> as.list(body(f))
# [[1]]
# `*`
# [[2]]
# [1] 2
# [[3]]
# x
答案 2 :(得分:0)
这是另一种解决方案,我尝试过,但认为失败了。我们可以使用一个闭包,它是一个返回函数的函数。
cl <- function(a){
f <- function(x){a*x}
return(f)
}
cl(1)(1)
cl(5)(1)