我试图在循环中创建包含i的函数,但我还没有被评估过。
例如,循环:
func <- list(0)
for (i in 1:3) {
func[[i]] <- function(x) i*x
}
产生
> func[[1]]
function(x) i * x
<bytecode: 0x0000000011316b08>
当我实际需要1 * x,2 * x,3 * x
时答案 0 :(得分:4)
编写一个返回函数的函数。请务必使用force()
强制评估延迟参数。
func <- list(0)
makefun <- function(i) {
force(i)
function(x) i*x
}
func <- Map(makefun, 1:3)
func[[1]](5)
# [1] 5
func[[2]](5)
# [1] 10
func[[3]](5)
# [1] 15
您可以在local()
的帮助下在for循环中执行此操作。
func <- list(0)
for (i in 1:3) {
func[[i]] <- local({i<-i; function(x) i*x})
}
在这两种情况下,定义仍然看起来像"function(x) i*x"
,但i
值来自的环境是不同的。
答案 1 :(得分:0)
问题在于,您的功能是指i
,但只有一个i
。MrFlick的答案是强制创建本地环境的一种方法i
的不同副本具有不同的值;另一种方法是使用local()
,例如
func <- list()
for (i in 1:3) {
func[[i]] <- local(
{
j <- i # make a local copy of the current value
function(x) j*x
} )
}
func[[1]](5)
# [1] 5
func[[2]](5)
# [1] 10
func[[3]](5)
# [1] 15