我正在尝试构建一个扩展另一个包的包。然而,在最基本的层面上,我做错了什么。我构建了一个提出相同问题的简单示例:
我有两个包packageA
和packageB
。 packageA
在R文件夹中有一个R文件,内容为:
local.env.A <- new.env()
setVal <- function()
{
local.env.A$test <- 1
}
getVal <- function()
{
if(!exists("test", envir = local.env.A)) stop("test does not exist")
return(local.env.A$test)
}
对于packageB,我在R文件夹中有以下单个R文件:
# refers to package A
setVal()
getValinA <- function()
{
return(getVal())
}
我希望最终用户可以使用packageA
和packageB
,因此我将packageB设置为依赖于packageA
(在说明文件中)。加载packageB
时,例如通过library(packageB)
我希望它运行setVal()
,从而设置测试值。但是,如果我接下来尝试获取通过getValinA()
设置的值,它会向我抛出停止:
> library(packageB)
Loading required package: PackageA
> getValinA()
Error in getVal() : test does not exist
我很确定它与环境有关,但我不确定如何。请帮忙!
答案 0 :(得分:2)
感谢@Roland。答案很简单。我有一种印象(假设假设假设!),当你执行library(packageB)
时,它会加载其中的所有动作,在我的例子中执行setVal()
函数。然而情况并非如此。如果您希望执行此功能,则需要将其放在函数.onLoad:
.onLoad <- function(libname, pkgname)
{
setVal()
}
按照惯例,您将此.onload
函数放在名为zzz.R
的R文件中。原因是,如果您没有专门整理R脚本,它将按字母顺序加载,并且至少在加载包中的所有函数时执行操作是有意义的。