在函数中传递和使用环境

时间:2013-06-04 04:34:06

标签: r function

我正在处理一些大型数据集并构建了负对数似然函数和相关梯度以传递给优化例程。这两个函数都需要参数向量和大数据集的传递。

优化例程将多次调用这两个函数,并且两个函数执行的速度是该过程中的大部分瓶颈。我不想直接传递数据,因为我认为可能会发生一些R复制。

我考虑过:

# some large data sets
a<-1; b<-2

# place the data sets in an environment
varSpace <- new.env()
assign('c', a, envir = varSpace)
assign('d', b, envir = varSpace)

dFunA <- function(x){
  x <- x + a+b
  x
}

dFunB <- function(x, envir = varSpace){
  x <- x + get('c', envir) + get('d', envir)
  x
}

dFunC <- function(x, envir = varSpace){
  with(envir,{
    x <- x + c + d
  })
  x
}

dFunD <- function(x, envir = varSpace){
  attach(envir)
  on.exit({detach(envir)})
  x <- x + c + d
  x
}


> dFunA(1)
[1] 4
> dFunB(1)
[1] 4
> dFunC(1)
Error in eval(expr, envir, enclos) : object 'x' not found
> dFunD(1)
[1] 4

方法A要求数据集在调用堆栈中更上一层楼。它有效,但我想要一个更整洁的方法。

方法B需要使用get并调用已放置数据的环境。

方法C不起作用。

方法D似乎有效,但我注意到?detach带有良好做法评论Use of attach/detach is best avoided in functions

任何帮助和建议都将不胜感激。

1 个答案:

答案 0 :(得分:1)

您无需使用assigngetattach。只需将您的功能环境设置为您创建的环境即可。

dFunA <- function(x)
x + a + b

varSpace <- new.env()
varSpace$a <- 1
varSpace$b <- 2
environment(dFunA) <- varSpace

......假设这首先是必要的。正如Aaron评论的那样,R是写时复制,所以除非你修改ab,否则它们不太可能被复制。