使用for循环生成数学函数

时间:2013-12-27 15:16:26

标签: r for-loop

我想使用for循环(在R中)以这样的方式生成数学函数,然后我可以通过f [3]为i = 3调用它们。

我最初的尝试是:

f<-NULL
for (i in 1:100){
    f[i]<-function(x){x*i}
}

这不起作用。我怀疑这是因为for循环自动生成一个向量,而一个函数不能适合向量。我也怀疑这个修复很简单。有谁知道如何生成这样的函数?

我的实际功能要复杂得多,但我想让问题可读。我也将重复这几千次,因此手动输入功能不是一个可行的选择。

3 个答案:

答案 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的值更复杂,但我只是回答您直接询问的问题。

相关问题