5

match.fun関数の 1 つに、パッケージ名前空間にインポートされたパッケージ内の関数への呼び出しが含まれている R パッケージに取り組んでいます。しかし、パッケージをロードすると、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ます。しかし、ここではそうではないようです。topicmodelsR セッションのグローバル名前空間に直接インポートすると、これは機能します。

どんな助けでも大歓迎です。これは、OSX 上で動作する R64 2.14.1 です。

更新: パッケージはこちら

おそらくそれが問題です: roxygen2 は記述ファイルをImports:ステートメントで更新しません。しかし、他のパッケージもそこにリストされていません。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)
4

2 に答える 2

8

これは範囲の問題だと思います。これらの関数をインポートtopicmodelsしたためLDAにエクスポートしていませんが、これらの関数は検索パスで使用できません。

差出人?match.fun

match.fun呼び出し元の親でマッチングを実行するため、トップレベルでの使用は意図されていません。

したがって、ModelTopicsグローバル環境で使用していて、グローバル環境でLDAは使用できないため、match.fun呼び出しは失敗します。


私には2つの選択肢があるようです。

オプション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ます

topicmodelsNAMESPACEで必要な関数を使用できるようにすると、コードも機能するはずです。

次のいずれかでこれを行います。

  • LDAを使用した名前空間への選択的なエクスポートおよびその他の関数@export
  • -を使用して依存関係を宣言します。これは、グローバル環境でDepends: topicmodels呼び出すのと同じです。library(topicmodels)これは機能しますが、おそらくブルートフォースアプローチのビットです。また、その後のlibrary呼び出しでLDA関数がマスクされ、予期しない結果が生じる可能性があることも意味します。
于 2012-08-16T16:13:30.270 に答える
0

私自身の質問に答えてください:更新されたコードを re-roxygenizing した後、DESCRIPTION ファイルはフィールドImports:とフィールドを更新していませんでした。Depends:したがって、match.fun問題。match.fun不思議なことに、これがインポートされたパッケージ関数に対して他の場所で行われた他の関数呼び出しの範囲に影響を与えるのに、なぜ影響しないのですか?

于 2012-08-16T16:00:52.653 に答える