2016-05-18 11 views
3

Ich habe einige R-Code, wo ich beginne zu viele Argumente in meine Funktionen zu erhalten, wie dieseEffizientes Verpackung und Funktionsargumente in R Auspacken

f<-function(a,b,c,d,e,f,g,...){ 
    #do stuff with a,b,c,d,e,f,g 
    return(list(q=q,r=r,s=s,...)) 
} 

ich dachte Argumente in Listen verwandter Parameter kollabiert und dann Extrahieren der Parameter aus den Listen innerhalb der Funktion. Das ist ärgerlich aber da ich eine Menge Standardcode zu verwenden, habe

list_of_params<-list(a=a,b=b,...) 
f<-function(list_of_params){ 
    a<-list_of_params[["a"]] 
    b<-list_of_params[["b"]] 
    c<-list_of_params[["c"]] 
    ... 
    #do stuff with a,b,c,... 
    return(list(q=q,r=r,s=s,...)) 
} 

ich dachte so etwas wie list2env mit den Variablen aus der Liste in die Umgebung der Funktion automatisch zu extrahieren. Hat jemand eine Meinung darüber, ob das ein vernünftiger Ansatz ist? Ich habe irgendwo gelesen, dass die Verwendung von assign eine schlechte Idee ist und das scheint ähnlich zu sein. Meine vorgeschlagene Funktion würde wie folgt aussehen:

f<-function(list_of_params){ 
    list2env(list_of_params, envir=as.environment(-1)) #-1 means current environment 
    #do stuff with a,b,c... 
    return(list(q=q,r=r,s=s,...)) 
} 

Ich habe noch nie assign() oder list2env() zuvor. Ich bin besorgt, dass sie tückische Fallstricke haben, auf die ich achten sollte, genauso wie attach(). Ist die Verwendung von list2env() hier sinnvoll? Wenn nicht, was ist diese Funktion?

+4

Warum brauchen Sie so viele Argumente? Halte es einfach. –

+0

Ich stimme Richard zu. Müssen Sie wirklich etwas mit/allen * dieser Argumente in einer Funktion machen? Es scheint, als ob Sie kleine Funktionen schreiben sollten, die eine Liste als Argument akzeptieren und ein oder zwei schnelle Dinge mit einer kleinen Anzahl der Listenkomponenten erledigen. Denken Sie an die Art und Weise, wie ein 'lm'-Objekt funktioniert - es ist nur eine Liste, aber wenn ich' predicate' oder 'summary' verwende, möchte ich keine einzelnen Komponenten weitergeben ... Ich gebe einfach das Modellobjekt (AKA die Liste). – Gregor

+3

Ich stimme mit Gregor überein, dass dies sehr breit und schwer ohne Kontext zu beantworten ist. – rawr

Antwort

0

Eine lange Liste von Parametern ist wahrscheinlich ein Code-Geruch. Am einfachsten ist es, zu stoppen und darüber nachzudenken, welche Art von Objekt Ihre Parameter einkapseln sollte. Es ist wahrscheinlich nicht nur eine einfache Liste.

Eine andere Option ist, wenn viele der Funktionsparameter in Bezug auf den prozeduralen oder lexikalischen Umfang festgelegt sind. Dann könnten Sie die Tatsache verwenden, dass functions are R are closures. Beispiel:

make_f <- function(object, params){ 
    e <- calculate_e(object, params) 
    f <- calculate_f(object, params) 
    g <- calculate_g(object, params) 
    f<-function(a,b,c,d,...){ 
     #do stuff with a,b,c,d,e,f,g 
     return(list(q=q,r=r,s=s,...)) 
    } 
    return(f) 
}