2011-11-02 8 views
6

Jak mogę zapewnić, że podczas wywoływania funkcji nie można pobierać zmiennych ze środowiska globalnego?Jak wyizolować funkcję?

Chciałbym następujący kod, aby dać mi błąd. Powodem jest to, że mogłem pomylić z (chciałem wpisać y).

z <- 10 
temp <- function(x,y) { 
     y <- y + 2 
     return(x+z) 
} 
> temp(2,1) 
[1] 12 

Zgaduję odpowiedź ma do czynienia ze środowiskami, ale nie zrozumieli tych jeszcze.

Czy istnieje sposób, aby moje domyślne zachowanie było domyślne (na przykład ustawiając opcję)?

+1

Istnieje pewna dyskusja w artykule z 27 lutego 2010 na stronie głównej proto: http://r-proto.googlecode.com. –

+0

@ G.Grothendieck dziękuję, to wygląda interesująco. Nie jestem pewien, czy mam ochotę zagłębić się w tak duży pakiet/zmianę filozofii. Ale będę o tym pamiętał, gdy zdobędę więcej doświadczenia. –

+0

Jestem prawie pewien, że to już zostało zadane tutaj. – hadley

Odpowiedz

4

Funkcja się nie zmienia, więc nie trzeba jej sprawdzać za każdym razem, gdy jest używana. findGlobals jest bardziej ogólny i trochę bardziej tajemniczy. Coś jak

Filter(Negate(is.null), eapply(.GlobalEnv, function(elt) { 
    if (is.function(elt)) 
     findGlobals(elt) 
})) 

mogli odwiedzić wszystkie funkcje w środowisku, ale jeśli istnieje kilka funkcji, to może nadszedł czas, aby myśleć o pisaniu pakietu (to nie jest takie trudne).

+0

dzięki! To wygląda na świetną funkcję. Jednak nadal musisz się martwić o środowisko, w którym się pojawia. tzn. jeśli skopiuję i wstawiam cały kod w moim oryginalnym wpisie, a następnie uruchomię "checkUsage (temp)", to nie zgłosi błędu. Muszę skopiować tylko funkcję 'temp'. –

+0

zobacz 'findGlobals' i strony pomocy dla pakietu. –

+0

ok Sprawdzę to. Jak uruchomić checkUsage na wszystkich funkcjach w ls()? Lub jeśli to trudne, zakładając, że są tylko funkcje wyprowadzane przez ls(), jak mogę uruchomić checkUsage na wszystkich z nich? Próbowałem 'lapply (ls(), FUN = checkUsage)' ale to nie działa. –

5
environment(temp) = baseenv() 

Zobacz także http://cran.r-project.org/doc/manuals/R-lang.html#Scope-of-variables i ?environment.

+0

Będzie maskował wszystkie zmienne oprócz zmiennych w środowisku bazowym. tj. pakiety dodatkowe nie są dostępne w 'temp'. – kohske

+0

i jak mam zamaskować wszystko oprócz 'base' i, powiedzmy, pakietu' plyr'? –

+0

Nie jestem pewien, ale może "environment (temp) <- new.env (parent = as.environment (search() [2]))" zamaskuje tylko środowisko globalne. – kohske

1
environment(fun) = parent.env(environment(fun)) 

(używam „zabawy” w miejsce nazwy funkcji „temp” dla jasności)

to usunie „obszar roboczy” Środowisko (.GlobalEnv) ze ścieżki wyszukiwania i zostawić wszystko else (np. wszystkie pakiety).

+0

dziękuję! Wypróbuję to następnym razem, gdy pojawi się. –

Powiązane problemy