假设您使用以下代码在R中定义函数:
a <- 1
f <- function(x) x + a
如果您重新定义a
,则会更改函数f。 (那么,f(1) = 2
给定,但如果您重新定义a =2
然后f(1) = 3
。有没有办法强制R在编译时使用a
的值函数?(也就是说,f
不会随后者重新定义a
而改变。
以上是我能想到的最短的案例,它体现了我所面临的问题。更具体地说,根据要求,我的情况是:
我正在处理一堆我打电话的对象&#34; person&#34;。每个人被定义为依赖于n维向量$ a $和n维向量w(财富份额)的概率分布。
我想创建一个&#34;社会&#34;与N人一起,这是N人的名单。为此,我创建了两个n乘N矩阵A和W.我现在循环1到N来创建个体。
Society <- list()
### doesn't evaluate theta at the time, but does w...
for (i in 1:Npeople) {
w <- WealthDist[i,]
u <- function(x) prod(x^A[i,])
P <- list(u,w)
names(P) <- c("objective","w")
Society[[length(Society)+1]] <- P
}
w得到的是价值传递,因此每个人都获得了适量的财富。但是A是传递引用 - 每个人被赋予相同的函数u(即使用i = N的函数)
要完成它,接下来的步骤是获得协会,并通过两个优化得到一个平衡点&#34;。
答案 0 :(得分:3)
您可以创建一个使用锁定绑定的函数,并创建一个函数来完成您的目的。 a的前一个值将用于w
,它将存储在函数的环境中,不会被a
的其他值更改替换。
a <- 1
j <- new.env() # create a new environment
create.func <- function () {
j$w <<- a
function (x) {
x+ j$w
}
}
f <- create.func()
a <- 2
f(2)
[1] 3 # if w was changed this should be 4
致Andrew Taylor的致谢(见评论)
编辑:小心:如果你拨打create.func
,f会改变,即使你没有把它存入f。为避免这种情况,您可以编写此代码(这显然取决于您的需求)。
a <- 1
create.func <- function (x) {
j <- new.env()
j$w <- a
function (x) {
x + j$w
}
}
f <- create.func()
f(1)
[1] 2
a <- 2
q <- create.func()
q(1)
[1] 3
f(1)
[1] 2
编辑2:延迟评估不适用于此处,因为a通过设置为j$w
进行评估。如果你用它作为参数说:
function(a)
function(x)
#use a here
在定义第二个函数之前,你必须使用force
,因为它不会被评估。
编辑3:我删除了foo <-
等。函数将在声明后立即返回,因为您希望它与链接中定义的代码工厂类似。
OP编辑只是为了加入已接受的答案 Function Factory in R 以下代码有效:
funs.gen <- function(n) {
force(n)
function(x) {
x + n
}
}
funs = list()
for (i in seq(length(names))) {
n = names[i]
funs[[n]] = funs.gen(i)
}
答案 1 :(得分:2)
R不通过引用传递;一切都按值传递给函数。正如您所注意到的,由于a
是在全局环境中定义的,因此引用a
的函数引用a
的全局值,该值可能会发生变化。为确保使用特定值a
,您可以将其用作函数中的参数。
f <- function(x, a = 1) {
x + a
}
这将a
定义为默认为1的参数。函数使用的a
的值将始终是传递给函数的值,无论a
是否为lapply()
在全球环境中定义。
如果您要使用a
,只需将lapply()
作为参数传递给lapply(X, f, a = <value>)
。
#include<stdio.h>
int main()
{
int i;
i =10;
printf(" %d %d %d ",i++,i++,i); //output : 11 10 12
return 0;
}
答案 2 :(得分:1)
在a
f
f <- function(x) {a<-1;x + a}