我正在尝试创建一个使用其他包( 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)
时才会开始工作。
答案 0 :(得分:0)
这是由于gamlss.tr
特别是trun.x
函数的错误设计(它们使用字符向量而不是系列对象/它们在函数环境而不是调用环境中评估所有内容)引起的。
要解决此问题,您必须确保gamlss.distr
在gamlss.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
(如果尚未附加)。