Roxygen认为我写的一个函数是S3方法,所以在安装我的包时出现了错误。

13

我正在使用roxygen来创建自己的包。 我有一个函数会引起问题:

##' extract.sig.metadata
##' @param foo bar
##' @author me
##' @export
extract.sig.metadata <- function(foo){
# does stuff
}

我已经创建了我的软件包框架(使用devtools中的create(my-package)命令),并使用document()处理roxygen标签。但是,当我尝试安装我的软件包时,安装失败,错误信息如下:
... * installing help indices ** building package indices ** testing if installed package can be loaded Error: 加载my-package包时未找到'extract'对象。 Error: 软件包加载失败 执行已停止
我相信roxygen认为extract.sig.metadata是一个S3方法,即export()的特殊形式,但它没有找到函数export(),导致出现了错误。但实际上,这不是s3方法,它只是一个名为extract.sig.metadata的函数。如果我查看Rd代码,/ usage标记看起来很奇怪:
\usage{
\method{extract}{sig.metadata}(spec.df, var = "product_name",
  ratio.cutoff = 0.001, prob.modifer = 3, frequency.cutoff = NA,
  verbose = F, assign.to.global.env = FALSE, use.bigrams = T, clean = T,
  ngram.dupe.n.cutoff = 0.1, max.obs = 10000)
}

如果我将名称更改为extractSigMetadata,问题在技术上就得到了解决,并且.Rd代码也会更改。

\usage{
 extractSigMetadata(foo)
}

但我真的不想改变我的函数名称(我的包中有数十个具有相同问题的函数,它们被用于许多脚本中 - 改变我的命名方案将是一件巨大的痛苦)。

---> 有人知道如何告诉roxygen这只是一个普通函数而不是奇怪的s3方法吗?我猜它与@method标签有关,但我不知道如何充分使用它使其正常工作。谢谢!!!


你正在运行哪个版本的Royxgen?你没有一个名为“extract”的通用函数,对吧? - MrFlick
1
没有通用版本的extract函数,但是R.utils有 - 这就是引起问题的原因。然而,使用@export extract.sig.metadata而不是@export可以解决它! - Hillary Sanders
1个回答

11

问题已解决!

使用@export extract.sig.metadata而不是@export,显然告诉roxygen,extract.sig.metadata是整个函数名,这就解决了问题。在这种特定情况下,我没有一个通用的提取函数,但R.utils(一个我的包没有依赖但仍然被加载的包)有一个提取函数。

希望这能帮助将来遇到同样问题的任何人。谢谢!

P.S. Hadley建议更好的命名惯例,我将尝试在未来遵循这些建议。


1
我曾经遇到过这个问题 - 我的次优解决方案是重命名函数。 - Dason
1
这还能用吗?"@export full.name"仍然给我\usage{\method{full}{name},真让人沮丧。 - rawr
要解决生成的帮助文本中错误的“S3 method for class”使用文本,请参见以下链接:https://dev59.com/_2Af5IYBdhLWcg3weyvZ#24607763 - R Yoda

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接