我想使用for循环(在R中)以这样的方式生成数学函数,然后我可以通过f [3]为i = 3调用它们。
我最初的尝试是:
f<-NULL
for (i in 1:100){
f[i]<-function(x){x*i}
}
这不起作用。我怀疑这是因为for循环自动生成一个向量,而一个函数不能适合向量。我也怀疑这个修复很简单。有谁知道如何生成这样的函数?
我的实际功能要复杂得多,但我想让问题可读。我也将重复这几千次,因此手动输入功能不是一个可行的选择。
答案 0 :(得分:3)
我认为您需要force
使用... force
函数对索引(i)进行评估,您还可以将for
循环替换为lapply
}。
size <- 5
f <- function(ind) { force(ind); function(x) x * ind }
fmult <- lapply(seq_len(size), function(i) f(i))
fmult[[3]](4)
## [1] 12
答案 1 :(得分:1)
这里有两个问题。首先,您需要使用列表而不是矢量。第二个问题有点微妙。如果你这样做
f<-list()
for (i in 1:100){
f[[i]]<-function(x){x*i}
}
这将创建一个函数列表,但问题是变量i
仍将引用全局环境。由于在循环之后,i
的值为100
,因此所有函数都是相同的:
> f[[5]](2)
[1] 200
> f[[10]](2)
[1] 200
为了解决这个问题,您可以创建一个新环境,以便每次循环时保存局部变量,并将此环境分配给该函数,如下所示:
f<-list()
for (i in 1:100){
e<-new.env()
e$i<-i
f[[i]]<-function(x){x*i}
environment(f[[i]])<-e
}
现在每个函数都会在其本地环境中查找i
,因此它按预期工作:
> f[[5]](2)
[1] 10
> f[[10]](2)
[1] 20
答案 2 :(得分:0)
size <- 100L
f<-vector("list", size)
for (i in seq_along(f)){
f[[i]]<- function(x){x*i}
}
你需要一个清单。另请注意,函数中的i
记录为i
,而不是i
的值。如果您希望i
的值更复杂,但我只是回答您直接询问的问题。