我有一些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()
是否合适?如果不是,那么什么是此函数的适当用法?
lm
对象的工作方式-它只是一个列表,但当我在其上使用predict
或summary
时,我不想逐个传入组件...我只需传入模型对象(也就是列表)。 - Gregor Thomasassign
更多的是“常见误用”,而不是“险恶陷阱”。当人们使用assign()
来构造变量名时,意味着他们应该使用列表。当人们使用assign()
从函数中删除全局环境中的内容时,意味着他们应该从函数中返回对象。 - Gregor Thomas