[英]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
調用失敗。
在我看來,你有兩個選擇:
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>
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.