Eran Eidinger
2011-Aug-24 07:28 UTC
[R] Passing a large amount of parameters to a function
Hello, I have a function with a long list of parameters (of different types, numeric and string) myFunc <-function(p1, p2, p3, p4, p5...etc) { do.something(p1,p2,....) } I want to loop over this to provide a different set of parameters to the list every time. for (ii in 1:N) { myFunc(p1(ii), p2(ii),....etc) } I would like to simplify the notation and use some kind of structure, maybe a list or dataframe. However when I try, for example, the following: params = data.frame(cbind(p1=c(1,2,3), p2=5, p3=c(3,2,1))) myFunc <-function(params) { attach(params) do.something(p1,p2,....) detach(params) } for (ii in 1:N) { myFunc(params[ii,]) } do.something fails because p1, p2,... are now factors, and i have to as.numeric() or as.char() each parameter before applying mathematical operators (such as simple multiplication). This defeats the purpose of simplifying the code. Is there any decent, simple way of doing this? Can I unfactor a row of a data.frame? or a list? (BTW, "as.numeric()" won't work since some of the parameters are strings, same goes for stringsAsFactors in data.frame) Thanks, Eran [[alternative HTML version deleted]]
Dimitris Rizopoulos
2011-Aug-24 07:55 UTC
[R] Passing a large amount of parameters to a function
You could use something like the following: paramsList <- list(p1 = 1:10, p2 = -5:5, p3 = 5, p4 = 8) params <- unlist(as.relistable(paramsList)) myFunc <- function (params) { params <- relist(params, skeleton = paramsList) p1 <- params$p1 p2 <- params$p2 p3 <- params$p3 p4 <- params$p4 ... } For another example have a look at the online help file of relist(). I hope it helps. Best, Dimitris On 8/24/2011 9:28 AM, Eran Eidinger wrote:> Hello, > > I have a function with a long list of parameters (of different types, > numeric and string) > > myFunc<-function(p1, p2, p3, p4, p5...etc) > { > do.something(p1,p2,....) > } > > I want to loop over this to provide a different set of parameters to the > list every time. > > for (ii in 1:N) > { > myFunc(p1(ii), p2(ii),....etc) > } > > I would like to simplify the notation and use some kind of structure, maybe > a list or dataframe. > However when I try, for example, the following: > > params = data.frame(cbind(p1=c(1,2,3), p2=5, p3=c(3,2,1))) > myFunc<-function(params) > { > attach(params) > do.something(p1,p2,....) > detach(params) > } > for (ii in 1:N) > { > myFunc(params[ii,]) > } > > > do.something fails because p1, p2,... are now factors, and i have to > as.numeric() or as.char() each parameter before applying mathematical > operators (such as simple multiplication). > This defeats the purpose of simplifying the code. > > Is there any decent, simple way of doing this? > Can I unfactor a row of a data.frame? or a list? > (BTW, "as.numeric()" won't work since some of the parameters are strings, > same goes for stringsAsFactors in data.frame) > > Thanks, > Eran > > [[alternative HTML version deleted]] > > ______________________________________________ > R-help at r-project.org mailing list > https://stat.ethz.ch/mailman/listinfo/r-help > PLEASE do read the posting guide http://www.R-project.org/posting-guide.html > and provide commented, minimal, self-contained, reproducible code. >-- Dimitris Rizopoulos Assistant Professor Department of Biostatistics Erasmus University Medical Center Address: PO Box 2040, 3000 CA Rotterdam, the Netherlands Tel: +31/(0)10/7043478 Fax: +31/(0)10/7043014 Web: http://www.erasmusmc.nl/biostatistiek/