在R中有效地打包和解包函数参数

时间:2016-05-18 19:15:32

标签: r function arguments

我有一些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()是否合适?如果没有,这个功能的适当用途是什么?

1 个答案:

答案 0 :(得分: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)
}