扩展R包无法与其“父”R包正确通信

时间:2017-05-10 07:51:51

标签: r

我正在尝试构建一个扩展另一个包的包。然而,在最基本的层面上,我做错了什么。我构建了一个提出相同问题的简单示例:

我有两个包packageApackageBpackageA在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())
}

我希望最终用户可以使用packageApackageB,因此我将packageB设置为依赖于packageA(在说明文件中)。加载packageB时,例如通过library(packageB)我希望它运行setVal(),从而设置测试值。但是,如果我接下来尝试获取通过getValinA()设置的值,它会向我抛出停止:

> library(packageB)
Loading required package: PackageA
> getValinA()
Error in getVal() : test does not exist

我很确定它与环境有关,但我不确定如何。请帮忙!

1 个答案:

答案 0 :(得分:2)

感谢@Roland。答案很简单。我有一种印象(假设假设假设!),当你​​执行library(packageB)时,它会加载其中的所有动作,在我的例子中执行setVal()函数。然而情况并非如此。如果您希望执行此功能,则需要将其放在函数.onLoad:

.onLoad <- function(libname, pkgname)
{
  setVal()
}

按照惯例,您将此.onload函数放在名为zzz.R的R文件中。原因是,如果您没有专门整理R脚本,它将按字母顺序加载,并且至少在加载包中的所有函数时执行操作是有意义的。