5

我正在开发一个 R 包,其中一个函数包含match.fun对导入到包命名空间的包中的函数的调用。但是在加载包时,match.fun调用找不到函数名。根据Hadley Wickham 的描述,我认为我做的一切都是正确的,但显然情况并非如此。

例子:

# in the package file header, for creation of the NAMESPACE via roxygen2:
##` @import topicmodels

# The function declaration in the package
ModelTopics <- function(doc.term.mat, num.topics, topic.method="LDA"){
  topic.fun <- match.fun(topic.method)
  output <- topic.fun(doc.term.mat, k=num.topics)
  return(output)

}    

然后在 R 中:

> library(mypackage)
> sample.output <- ModelTopics(my.dtm, topic.method="LDA", num.topics=5)
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'LDA' of mode 'function' was not found

根据我对命名空间的理解,match.fun调用应该可以访问包命名空间,其中应该包含topicmodels函数。但这里的情况似乎并非如此。如果我topicmodels直接导​​入到 R 会话的全局命名空间,那么这可行。

任何帮助深表感谢。这是在 OSX 上运行的 R64 2.14.1。

更新:包裹在这里

重新描述文件,也许这就是问题所在:roxygen2 没有用Imports:语句更新描述文件。但是那里也没有列出其他软件包;只有match.fun通话似乎受到影响。

重新命名空间提取,这是导入部分:

import(catspec)
import(foreach)
import(gdata)
import(Hmisc)
import(igraph)
import(lsa)
import(Matrix)
import(plyr)
import(RecordLinkage)
import(reshape)
import(RWeka)
import(stringr)
import(tm)
import(topicmodels)
4

2 回答 2

8

我认为这是一个范围问题。尽管您已经导入了topicmodelsand LDA,但您还没有导出这些函数,因此它们在搜索路径中不可用。

来自?match.fun

match.fun不打算在顶层使用,因为它将在调用者的父级中执行匹配。

因此,由于您在全局环境中使用ModelTopics,并且在全局环境LDA中不可用,因此match.fun调用失败。


在我看来,您有两种选择:

选项 1:使用get

另一种方法是使用get可以指定环境的地方。考虑一下:尝试使用在包match.fun中查找:print.ggplotggplot2

match.fun("print.ggplot")
Error in get(as.character(FUN), mode = "function", envir = envir) : 
  object 'print.ggplot' of mode 'function' was not found

由于print.ggplot没有导出,match.fun所以找不到。

但是,get确实找到了它:

get("print.ggplot", envir=environment(ggplot))
function (x, newpage = is.null(vp), vp = NULL, ...) 
{
    set_last_plot(x)
    if (newpage) 
        grid.newpage()
    data <- ggplot_build(x)
    gtable <- ggplot_gtable(data)
    if (is.null(vp)) {
        grid.draw(gtable)
    }
    else {
        if (is.character(vp)) 
            seekViewport(vp)
        else pushViewport(vp)
        grid.draw(gtable)
        upViewport()
    }
    invisible(data)
}
<environment: namespace:ggplot2>

选项 2:从中导出topicmodels您需要的功能

如果您在 NAMESPACE 中提供了必要的功能topicmodels,您的代码也应该可以工作。

通过以下任一方式执行此操作:

  • 使用选择性导出LDA和其他功能到命名空间@export
  • 声明一个依赖,使用- 这与在全局环境Depends: topicmodels中调用相同。library(topicmodels)这将起作用,但可能是一种蛮力方法。这也意味着任何后续library调用都可能掩盖您的LDA函数,从而导致意外结果。
于 2012-08-16T16:13:30.270 回答
0

回答我自己的问题:DESCRIPTION 文件在重新氧化更新的代码后没有更新Imports:and字段。Depends:因此match.fun问题。出于好奇,为什么这会影响match.fun但不影响在其他地方对导入的包函数进行的一系列其他函数调用?

于 2012-08-16T16:00:52.653 回答