2016-05-18 55 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) 
}