10

特定の変数または関数がパッケージに存在するかどうかをテストしようとしています。たとえば、呼び出された関数plotがパッケージ「graphics」に存在するかどうかをテストしたいとします。

以下は、関数plotが存在するかどうかをテストしますが、それがどのパッケージからのものであるかはテストしません。

exists('plot', mode='function')

または、呼び出されたものがパッケージにplot存在することをテストできgraphicsますが、これは関数であるかどうかを教えてくれません。

'plot' %in% ls('package:graphics')

「モードZのパッケージYにXというオブジェクトが存在するか」と尋ねる良い方法はありますか?(基本的existsに、特定のパッケージに制限できますか?)

(はい、上記の2行を組み合わせて、最初にあるテストをplot行いgraphics、次にのモードを要求できますplotが、独自の関数plotマスキングがある場合はどうgraphics::plotなりますか?次に、の出力を信頼できexists('plot', mode='function')ますか?)

背景:私のパッケージのテストを作成していて、さまざまな関数がエクスポートされていることをテストしたいと考えています。testthatパッケージのすべての内部機能を確認できる環境でテストを実行するパッケージを使用していてexists('myfunction', mode='function')、trueを返すことで悩まされてきましたが、実際にはエクスポートするのを忘れていましたmyfunctionさまざまな関数がエクスポートされることをテストしたいと思います。

4

3 に答える 3

13

ああ、見つけた。

?lsその中で、最初の議論('package:graphics'私にとって)も環境として数えられると書かれていることに気づきました。exists'引数には'where引数と同じドキュメントがあるので、そこでも機能する可能性があると思います。lsname'package:graphics'

exists('plot', where='package:graphics', mode='function')
[1] TRUE  # huzzah!
于 2013-03-05T01:50:18.193 に答える
8
 environment(plot)
<environment: namespace:graphics>

find('+')
#[1] "package:base"

find('plot')
#[1] "package:graphics"

find('plot', mode="function")
#[1] "package:graphics"
于 2013-03-05T02:18:48.517 に答える
0

以前に提案されたすべての答えは、名前空間ではなく、環境を歩きます。library()したがって、それらの動作は、ターゲットパッケージがでロードされたかどうか、およびその順序によって異なります。

これがアプローチutils::getFromNamespace()です:

function_exists <- function(package, funcname) {
    tryCatch({
        utils::getFromNamespace(funcname, package)
        TRUE
    }, error = function(...) { FALSE })
}
于 2021-09-21T12:05:33.880 に答える