我在很多R包中的.First.lib函数中看到以下习语:
fullName <- paste("package", pkgname, sep=":")
myEnv <- as.environment(match(fullName, search()))
barepackage <- sub("([^-]+)_.*", "\\1", pkgname)
dbbase <- file.path(libname, pkgname, "R", barepackage)
rm(.First.lib, envir = myEnv)
lazyLoad(dbbase, myEnv)
if(exists(".First.lib", envir = myEnv, inherits = FALSE)) {
f <- get(".First.lib", envir = myEnv, inherits = FALSE)
if(is.function(f))
f(libname, pkgname)
else
stop(gettextf("package '%s' has a non-function '.First.lib'",
pkgname),
domain = NA)
}
Run Code Online (Sandbox Code Playgroud)
我知道在加载包时会运行.First.lib函数.
我知道上面的代码定义了一个包的环境并设置了一个路径,但是我不明白为什么它在显式删除.First.lib函数之后正在寻找一个.First.lib函数.是什么让上述成语如此普遍?将它包含在R包中是"最佳实践"吗?
Rom*_*ois 11
那种成语很古老.包应该有名称空间并使用.onLoad,.onUnload和.onAttach.例如:
.onLoad <- function(libname, pkgname){
# do whatever needs to be done when the package is loaded
# some people use it to bombard users with
# messages using
packageStartupMessage( "my package is so cool" )
packageStartupMessage( "so I will print these lines each time you load it")
}
Run Code Online (Sandbox Code Playgroud)
只需将其添加到DESCRIPTION文件中,最好避免调用lazyLoad函数的whold业务:
LazyLoad: true
Run Code Online (Sandbox Code Playgroud)