2016-05-18 53 views
3

我在那裏我開始得到太多的參數在我的函數的一些R代碼裏面,這樣有效地包裝和拆包函數參數中的R

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,...)) 
} 

我想崩潰的論點到相關的參數列表然後從函數內的列表中提取出參數。這是惱人的,雖然,因爲我不得不使用大量的樣板代碼

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,...)) 
} 

我想使用像list2env東西,從列表中的變量自動提取到的函數的環境。有沒有人對這是否是合理的方法有意見?我在某處讀到使用assign是個不好的主意,這看起來很相似。我提出的功能應該是這樣的:

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,...)) 
} 

我從來沒有使用過assign()list2env()。我擔心他們可能存在我應該留意的險惡陷阱,方式與attach()相同。在這裏使用list2env()是否合適?如果沒有,這個函數的適當用法是什麼?

+4

爲什麼你需要這麼多的論據?把事情簡單化。 –

+0

我同意理查德。你真的需要用一個函數中的所有參數來做些什麼嗎?看起來你應該寫一些接受列表作爲參數的小函數,並用少量的列表組件做一兩個快速的事情。想一下'lm'對象的工作方式 - 它只是一個列表,但是當我使用'predict'或'summary'時,我不想傳入單個組件......我只是傳入模型對象( AKA的名單)。 – Gregor

+3

我同意格雷戈爾的觀點,這是非常廣泛和難以回答的,沒有語境 – rawr

回答

0

長長的參數列表可能是代碼異味。 要做的最簡單的事情就是停下來,並考慮應該封裝參數的對象的類型。這可能不僅僅是一個簡單的列表。

另一種選擇是,如果許多函數參數在程序或詞法範圍方面保持固定。那麼你可以使用functions are R are closures的事實。例如:

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) 
}