如何在加载 R 包时干净地定义一组变量,并在卸载时清除它们



我想在包加载时定义一组颜色,并在包分离时清除一组颜色。

我想出的似乎有效的方法显示在下面的玩具示例中,该示例依赖于深度分配(我知道这是邪恶的(

.onLoad <- function(libname, pkgname) {
}
.registerColors <- function(){
  C.1 <<- c("#FF0000FF", "#80FF00FF", "#00FFFFFF", "#8000FFFF")
  C.2 <<- c("#00AAFFFF", "#0000FFFF", "#AA00FFFF", "#FF00AAFF")
}
.onUnload <- function(libpath){
}
.onAttach <- function(libname, pkgname) {
  .registerColors()
  packageStartupMessage("Welcome to XYZ")
}
.onDetach <- function(libname, pkgname) {
  rm(C.1, C.2, pos = 1)
  packageStartupMessage("Buh-bye")
}

在这种情况下,plot(seq(1:4, col = C.1( 有效。有没有更好、更优雅或更少潜在破坏性的方式来实现这一点?

你真的不需要去找那么多麻烦。只需定义一个函数来检查包是否已加载,并返回适当的颜色。

chooseCols <- function()
{
    if("this_package" %in% search())
        C.1
    else # use default colours
}
plot(1:4, col=chooseCols())
似乎按照

我想要的方式工作是:

.registerColors <- function(){
  assign(x = 'C.1', value = c("#FF0000FF", "#80FF00FF", "#00FFFFFF", "#8000FFFF"), pos = 2)
  assign(x = 'C.2', value = c("#00AAFFFF", "#0000FFFF", "#AA00FFFF", "#FF00AAFF"), pos = 2)
}
.onAttach <- function(libname, pkgname) {
  .registerColors()
}

现在,颜色可以按名称访问,它们不会出现在全局环境搜索列表中(将我们从邪恶中拯救出来(,因此它们不需要在分离时手动清除,因为它们所在的包环境在分离时会自动清除。

这样做的好处是,用户现在可以直接将调色板作为变量访问,而无需调用函数。

最新更新