我正在处理一些大型数据集,并构建了一个负对数似然函数和相关梯度以传递给优化例程。这两个函数都需要一个参数向量并将大型数据集传递给它们。
优化例程将多次调用这两个函数,而这两个函数的执行速度是该过程中的大部分瓶颈。我不想将数据直接传递给函数,因为我的印象是 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
。
任何帮助和建议将不胜感激。