如何在 R 包加载时干净地定义一组变量并在卸载时清除它们?
How to cleanly define a set of variables when an R package loads and clear them on unload?
我想要一组颜色在加载包时定义并在包分离时清除。
下面的玩具示例显示了我想出的似乎有效的方法,它依赖于深度分配(我知道它是 evil)
.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) 有效。是否有更好或更优雅或潜在破坏性更小的方法来实现它?
你真的不需要那么麻烦。只需定义一个函数来检查包是否已加载,以及 returns 适当的颜色。
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()
}
现在可以通过名称访问颜色,它们不会出现在全局环境搜索列表中(将我们从邪恶中拯救出来),因此不需要清除它们手动分离,因为它们所在的包环境在分离时自动清除。
这样做的好处是,用户现在可以直接将调色板作为变量访问,而无需调用函数。
我想要一组颜色在加载包时定义并在包分离时清除。
下面的玩具示例显示了我想出的似乎有效的方法,它依赖于深度分配(我知道它是 evil)
.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) 有效。是否有更好或更优雅或潜在破坏性更小的方法来实现它?
你真的不需要那么麻烦。只需定义一个函数来检查包是否已加载,以及 returns 适当的颜色。
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()
}
现在可以通过名称访问颜色,它们不会出现在全局环境搜索列表中(将我们从邪恶中拯救出来),因此不需要清除它们手动分离,因为它们所在的包环境在分离时自动清除。
这样做的好处是,用户现在可以直接将调色板作为变量访问,而无需调用函数。