簡體   English   中英

R名稱空間訪問和match.fun

[英]R namespace access and match.fun

我正在開發一個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:語句更新DESCRIPTION文件。 但是其他包都沒有在那里列出; 只有match.fun調用似乎受到影響。

重新命名NAMESPACE,這是導入部分:

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)

我認為這是一個范圍問題。 雖然您已導入了topicmodels並因此導入了LDA ,但您尚未導出這些函數,因此它們在搜索路徑中不可用。

來自?match.fun

match.fun不打算在頂級使用,因為它將在調用者的父級中執行匹配。

因此,由於您在全局環境中使用ModelTopics ,並且LDA在全局環境中不可用,因此match.fun調用失敗。


在我看來,你有兩個選擇:

選項1:使用get

另一種方法是使用get來指定環境。 試想一下:嘗試使用match.fun找到print.ggplot在包ggplot2

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導出函數

如果您從topicmodels提供的topicmodels創建必要的函數, topicmodels您的代碼也應該可以運行。

通過以下任一方式執

  • 使用@export選擇性地將LDA和其他函數導出到命名空間
  • 使用Depends: topicmodels聲明依賴Depends: topicmodels - 這與在全局環境中調用library(topicmodels)相同。 這將有效,但可能是一種蠻力方法。 這也意味着任何后續library調用都可以掩蓋您的LDA功能,從而導致意外結果。

回答我自己的問題:在重新氧化更新的代碼之后,DESCRIPTION文件沒有更新Imports:Depends:字段。 因此match.fun問題。 出於好奇,為什么這會影響match.fun但不影響其他地方對導入的包函數的一系列其他函數調用?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM