0

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

优化例程将多次调用这两个函数,而这两个函数的执行速度是该过程中的大部分瓶颈。我不想将数据直接传递给函数,因为我的印象是 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

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

4

1 回答 1

1

您无需摆弄assign,getattach. 只需将函数的环境设置为您创建的环境即可。

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

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

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

于 2013-06-04T05:06:51.383 回答