R,函数内的值传递

时间:2015-04-23 18:11:37

标签: r reference pass-by-reference pass-by-value

假设您使用以下代码在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;。

3 个答案:

答案 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}