2013-03-05 17 views
6

Próbuję sprawdzić, czy konkretna zmienna lub funkcja istnieje w pakiecie. Załóżmy na przykład, że chcę przetestować, czy istnieje funkcja o nazwie plot w pakiecie "grafika".Sprawdź, czy zmienna/funkcja istnieje w pakiecie?

Poniższe testy czy funkcja plot istnieje, ale nie to, co pakiet pochodzi z:

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

Albo można przetestować, że coś o nazwie plot istnieje w pakiecie graphics, ale nie powiedzieć, czy jest to funkcja:

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

Czy istnieje dobry sposób, aby zapytać „czy obiekt o nazwie X istnieje w trybie opakowania Y z”? (Zasadniczo mogę ograniczyć exists do określonego pakietu?)

(Tak, mogę połączyć powyższe dwie linie do pierwszego testu, który plot jest w graphics a następnie poprosić o trybie plot, ale co jeśli miałem ? moja własna funkcja plot maskowania graphics::plot mógłbym wtedy zaufać wyjście exists('plot', mode='function'))

Tło: testy pisania dla pakietu kopalni i chcesz przetestować, że różne funkcje są eksportowane. Używam pakietu testthat, który wykonuje testy w środowisku, w którym widzę wszystkie wewnętrzne funkcje pakietu i został użądlony przez exists('myfunction', mode='function') zwracając true, ale faktycznie zapomniałem wyeksportować myfunction. Chcę przetestować, że różne funkcje są eksportowane .

+0

Jest w związku z tym [Pytanie] (http://stackoverflow.com/ pytania/14430728/find-functions-with-specific-arguments/14430885 # 14430885) – agstudy

Odpowiedz

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

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

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

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

Środowisko jest tu trochę czerwonego śledzia - to środowisko, w którym stworzono "fabułę", a nie tam, gdzie ją znaleziono. – hadley

+0

Myślę, że byłby to czerwony śledzia w przypadku, gdy funkcja jest ogólna, ponieważ na pewno jest tutaj. Jeśli nie byłby on ogólny, czy nie powiedziałby użytkownikowi, gdzie najpierw będą wyszukiwane połączenia? –

+0

Zwróć uwagę, że środowiskiem 'plot' jest' namespace: graphics', ale znajduje się ono w 'package: graphics' - to są różne środowiska. Więcej szczegółów można znaleźć w https://github.com/hadley/devtools/wiki/environments (szukaj środowisk funkcji). – hadley

7

Och, znalazłem to.

Zauważyłem, że w ?ls mówi się, że pierwszy argument ('package:graphics' dla mnie) również liczy się jako środowisko. existswhere argumentem ma taką samą dokumentację jako lsname argumentu, więc domyśliłem 'package:graphics' może działać tam:

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

+1 ale to nie działa dla funkcji wewnętrznej. ** ::: **, ie 'exists ('parse_formula', where = 'package: reshape2', mode = 'function')' – agstudy

+2

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

+0

Tak, ja w szczególności nie chcę wewnętrznych funkcji ... o, widzę, że powiedziałem "istnieje" w moim pytaniu, miałem na myśli "eksport"! oops –