R中的可变默认包值

时间:2011-09-07 23:45:17

标签: r package default-value

我正在为R开发一个软件包,我想设置一些软件包范围的默认值,以便稍后修改它们。我知道这听起来像全局变量因此是邪恶的,但是我需要这个来控制分析和调试以及设置后端(包可以使用各种外部程序来完成它的事情而我称之为后端)。

对于调用堆栈中的所有函数,所有这三个设置应同时更改。例如,如果我拨打mypackage::function1(profiling = T)function1来电话mypackage::function2mypackage::function3,那么我希望对那些呼叫进行分析。一种解决方案可能是做 mypackage::turn.on.profiling()并且所有函数都引用了一些包变量,但它需要具有锁定环境的技巧和类似的东西。

另一个可能是动态范围,通过sys.frame函数系列进行模拟(也就是说,一旦打开分析,它就会在堆栈上的那个点以​​下的任何地方开启)。不要告诉我R中的分析不能像那样工作,因为这是一种不同类型的分析,建立在现有分析之上,但不同。

我毫不怀疑我可以用这种或那种方式破解它,但我想知道CRAN中是否存在规范解决方案或至少一些先例,以便我不会重新发明轮子。< / p>

2 个答案:

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