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

在R中有效地打包和解包函数参数,r,function,arguments,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,...)) } 我以前从未使用过assign()或list2env()。我担心他们可能有我应该注意的危险陷阱,就像attach()一样。在此处使用list2env()是否合适?如果没有,该函数的适当用途是什么?一长串参数可能是代码味道。 最简单的方法是停止

我有一些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,...))
}

我以前从未使用过
assign()
list2env()
。我担心他们可能有我应该注意的危险陷阱,就像
attach()
一样。在此处使用
list2env()
是否合适?如果没有,该函数的适当用途是什么?

一长串参数可能是代码味道。 最简单的方法是停止,并考虑应该封装参数的对象类型。这可能不仅仅是一个简单的列表

另一种选择是,如果许多函数参数在过程或词法范围方面保持固定。然后你可以利用这个事实。例如:

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

make\f为什么需要这么多参数?简单点,我同意理查德的观点。您真的需要对函数中的所有这些参数进行处理吗?看起来您应该编写接受列表作为参数的小函数,并使用少量列表组件快速完成一到两件事情。想想
lm
对象的工作方式——它只是一个列表,但当我在上面使用
predict
summary
时,我不想传递单个组件。。。我只是传递了模型对象(也称为列表)。我同意gregor的观点,这是非常广泛的,没有上下文就很难回答。我认为
assign
更多的是“常见的误用”,而不是“危险的陷阱”。当人们使用
assign()
时,因为他们使用
paste
构造变量名,这意味着他们应该使用列表。当人们使用
assign()
从函数中删除全局环境中的内容时,这意味着他们应该从函数中返回对象。我同意rawr同意Gregor同意我的观点。
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,...))
}
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)
}