2013-03-05 9 views
6

Ich versuche zu testen, ob eine bestimmte Variable oder Funktion in einem Paket vorhanden ist. Angenommen, ich möchte testen, ob eine Funktion namens plot im Paket 'graphics' vorhanden ist.Sehen Sie, ob eine Variable/Funktion in einem Paket existiert?

Die folgenden Tests, ob eine Funktion plot vorhanden ist, aber nicht das, was Paket es herkommt:

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

Oder ich, dass etwas in dem graphics Paket besteht genannt testen plot, aber mir nicht sagen, ob es ist eine Funktion:

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

gibt es eine nette Art und Weise „ist ein Objekt namens X existiert in Paket Y Mode Z“ zu fragen? (Im Grunde kann ich beschränken exists auf ein bestimmtes Paket?)

(Ja, ich die beiden oben genannten Linien zu ersten Test kombinieren, dass plot in graphics ist und dann für den Modus von plot fragen, aber was ist, wenn ich hatte ? meine eigene Funktion plotgraphics::plot maskieren kann ich dann der Ausgabe von exists('plot', mode='function') vertrauen)

Hintergrund: das Schreiben von Tests für ein Paket von mir und will, dass die verschiedenen Funktionen testen, exportiert werden. Ich benutze das Paket testthat, das Tests in einer Umgebung ausführt, in der ich alle internen Funktionen des Pakets sehen kann, und die von exists('myfunction', mode='function') zurückgegeben wurden, true zurück, aber ich habe tatsächlich vergessen, myfunction zu exportieren. Ich möchte testen, dass verschiedene Funktionen exportiert werden.

+0

Dies ist im Zusammenhang mit dieser [Frage] (http://stackoverflow.com/ Fragen/14430728/Finde-Funktionen-mit-spezifischen-Argumente/14430885 # 14430885) – agstudy

Antwort

5
environment(plot) 
<environment: namespace:graphics> 

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

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

find('plot', mode="function") 
#[1] "package:graphics" 
+1

Die Umgebung ist ein bisschen Red-Hering hier - das ist die Umgebung, wo "Plot" erstellt wurde, nicht dort, wo es gefunden wurde. – hadley

+0

Ich denke, es wäre ein Ablenkungsmanöver in dem Fall, in dem eine Funktion generisch ist, wie es sicherlich hier ist. Wenn es nicht generisch wäre, würde das dem Benutzer nicht sagen, wo zuerst nach Anrufen gesucht werden würde? –

+0

Beachten Sie, dass die Umgebung von 'plot'' namespace: graphics' ist, aber in 'package: graphics' gefunden wird - das sind unterschiedliche Umgebungen. Es gibt mehr Details in https://github.com/hadley/devtools/wiki/environments (Suche nach Funktionsumgebungen) – hadley

7

Oh, ich habe es gefunden.

Ich bemerkte, dass in ?ls es besagt, dass das erste Argument ('package:graphics' für mich) auch als eine Umgebung zählt. exists 'where Argument hat die gleiche Dokumentation als ls' name Argument, so vermuten ich 'package:graphics' könnte es auch funktionieren:

exists('plot', where='package:graphics', mode='function') 
[1] TRUE # huzzah! 
+1

+1 aber dies funktioniert nicht für die interne Funktion. ** ::: **, dh 'exists ('parse_formula', where = 'Paket: reshape2', mode = 'function')' – agstudy

+2

'getFromNamespace ('parse_formula', ns = 'reshape2')' –

+0

Ja, ich speziell nicht interne Funktionen wollen ... oh, ich sehe ich sagte "existiert" in meiner Frage, ich meinte "Exporte"! oops –

Verwandte Themen