我正在为R开发一个软件包,我想设置一些软件包范围的默认值,以便稍后修改它们。我知道这听起来像全局变量因此是邪恶的,但是我需要这个来控制分析和调试以及设置后端(包可以使用各种外部程序来完成它的事情而我称之为后端)。
对于调用堆栈中的所有函数,所有这三个设置应同时更改。例如,如果我拨打mypackage::function1(profiling = T)
和function1
来电话mypackage::function2
和mypackage::function3
,那么我希望对那些呼叫进行分析。一种解决方案可能是做
mypackage::turn.on.profiling()
并且所有函数都引用了一些包变量,但它需要具有锁定环境的技巧和类似的东西。
另一个可能是动态范围,通过sys.frame
函数系列进行模拟(也就是说,一旦打开分析,它就会在堆栈上的那个点以下的任何地方开启)。不要告诉我R中的分析不能像那样工作,因为这是一种不同类型的分析,建立在现有分析之上,但不同。
我毫不怀疑我可以用这种或那种方式破解它,但我想知道CRAN中是否存在规范解决方案或至少一些先例,以便我不会重新发明轮子。< / p>
答案 0 :(得分:3)
您可以在function1
的开头设置一个选项,并在结尾处或通过on.exit
取消设置。类似的东西:
function1 <- function() {
op <- options() # current state of options
on.exit(options(op)) # restore when function exits
print(getOption("mypackage.profiling"))
options(mypackage.profiling=TRUE) # turn on profiling
print(getOption("mypackage.profiling"))
}
options(mypackage.profiling=FALSE)
function1()
# [1] FALSE
# [1] TRUE
getOption("mypackage.profiling")
# [1] FALSE
您还可以通过.onLoad
答案 1 :(得分:2)
另一种简单的方法是将参数放在包中的环境对象中,让你的turn.on.profiling
函数修改它。
# Don't export this
.profileOptions <- new.env(parent=emptyenv())
.profileOptions$enabled <- FALSE
# export this one
profilingEnabled <- function(flag = NA) {
oldFlag <- .profileOptions$enabled
if (!is.na(flag)) {
.profileOptions$enabled = flag
}
oldFlag
}
# then use it
profilingEnabled() # returns TRUE or FALSE
profilingEnabled(TRUE) # enables profiling, returns previous state