从未找到依赖项导入的函数,需要库(依赖项)

时间:2017-12-07 20:33:46

标签: r dependencies devtools

我正在尝试创建一个使用其他包( gamlss.tr )中的函数的R包。

我需要来自依赖项的函数是gamlss.dist::TF gamlss.dist gamlss.tr 一起加载),但它在我的代码中被引用为在致电TF时只需gamlss.tr::gen.trun

当我使用library()手动加载 gamlss.tr 时,这可行。但是,当我依赖于我的包通过@import自动导入依赖项的功能时,一旦访问TF,我就会收到“找不到对象”错误。

我尝试更明确地引用我需要的函数gamlss.dist::TF导致了一个不同的错误(“unexpected'::'”)。

非常感谢有关如何在我的包装中使用此功能的任何提示!

如果合并到一个干净的R包中(如this .zip中所做),使用document("/path/to/package")构建和加载,下面的代码会重现该问题:

#' @import gamlss gamlss.tr gamlss.dist
NULL

#' Use GAMLSS
#'
#' Generate a truncated distribution and use it.
#' @export

use_gamlss <- function() {
  print("gen.trun():")

  gamlss.tr::gen.trun(par=0,family=TF)
    #Error in inherits(object, "gamlss.family") : object 'TF' not found
  #gamlss.tr::gen.trun(par=0,family=gamlss.dist::TF)
    #Error in parse(text = fname) : <text>:1:1: unexpected '::'
  y = rTFtr(1000,mu=10,sigma=5, nu=5)

  print("trun():")

  truncated_dist = gamlss.tr::trun(par=0,family=TF, local=TRUE)
  model = gamlss(y~1, family=truncated_dist)
  print(model)
}

use_gamlss()只有在用户拨打library(gamlss.tr)时才会开始工作。

1 个答案:

答案 0 :(得分:0)

这是由于gamlss.tr特别是trun.x函数的错误设计(它们使用字符向量而不是系列对象/它们在函数环境而不是调用环境中评估所有内容)引起的。

要解决此问题,您必须确保gamlss.distrgamlss.tr函数执行环境的搜索路径中(这就是#@ import-将其放入包中的原因)无济于事:需要在#' @import中进行gamlss.tr编辑。

这可以通过将其添加到包的Depends:中来实现。

如果要避免附加软件包也附加gamlss.distr,还可以在use_gamlss的顶部添加以下内容:

  nsname <-"gamlss.dist"
  attname <- paste0("package:", nsname)
  if (!(attname %in% search())) {
    attachNamespace(nsname)
    on.exit(detach(attname, character.only = TRUE))
  }

这将临时附加gamlss.dist(如果尚未附加)。

您可以在Hadley Wickham's "Advanced R"

中阅读有关R中名称空间的更多信息。