2011-04-26 16 views
20

Chciałbym podać argument funkcji params, a następnie dołączyć go, aby móc używać zamiast parametrów $ za każdym razem, gdy odwołuję się do elementu listy.attach() wewnątrz funkcji

run.simulation<-function(model,params){ 
attach(params) 
# 
# Use elements of params as parameters in a simulation 
detach(params) 
} 

Czy jest z tym jakiś problem? Jeśli zdefiniowałem globalną zmienną o nazwie c, a także zdefiniowałem element o nazwie c listy "params", której wartość będzie używana po poleceniu attach?

Odpowiedz

25

Noah już wskazał, że używanie attach jest złym pomysłem, nawet jeśli widzisz go w niektórych przykładach i książkach. Jest na to sposób. Możesz użyć "lokalnego załącznika" o nazwie with. W przykładowym atrapach Noego będzie to wyglądało na takie, które da identyczny wynik, ale jest bardziej przejrzyste.

+4

+1 Warto wyjaśnić co 'z()' i 'terminie()' zrobić. W podanym przykładzie 'with()' tworzy środowisko z 'params', a następnie oblicza wyrażenie' print (a) '_inside_ to environment. W związku z tym składniki "params" są widoczne, gdy wyrażenie jest obliczane, bez konieczności "dołączania()" ich. –

+0

Dziękuję bardzo za klarowne odpowiedzi. –

+0

Więc na końcu działała funkcja "myFun" (model, params) {z (params), {...}} 'gdzie ... jest ciałem funkcji –

8

Najprostszym sposobem rozwiązania problemów, zakres jak to zwykle spróbować czegoś prostego out:

a = 1 
params = c() 
params$a = 2 
myfun <- function(params) { 
    attach(params) 
    print(a) 
    detach(params) 
} 
myfun(params) 

Poniżej przedmiot (y) są maskowane _by_ .GlobalEnv:

a

# [1] 1 

Jak widać, R podnosi e globalny atrybut a tutaj.

To prawie zawsze jest to dobry pomysł, aby unikać attach i detach tam gdzie to możliwe - zakres kończy się trudne w obsłudze (nawiasem mówiąc, jest to również najlepiej unikać nazywania zmiennych c - R często dowiedzieć się, co masz na myśli do, ale jest tak wiele innych listów, po co ryzykować?). Ponadto znajduję kod za pomocą polecenia attach/detach, który jest prawie niemożliwy do odczytania.

6

Inną możliwością jest:

run.simulation <- function(model, params){ 
    # Assume params is a list of parameters from 
    # "params <- list(name1=value1, name2=value2, etc.)" 
    for (v in 1:length(params)) assign(names(params)[v], params[[v]]) 
    # Use elements of params as parameters in a simulation 
}