ripley@stats.ox.ac.uk
2002-Jun-07 08:59 UTC
[R] Hope fo help - functions, fits and for cycles
1) add1 does this for you, more efficiently! 2) You are trying to add mydata[,expl[j]]) to a formula. That makes no sense in the context of the formula, and I think you need to define it as a variable in your function and then try to add that variable. 3) update within a function is tricky because of the scope rules. It follows the S scope rules, AFAICS. A much better idea is to add the variable you want either to the data argument or to the environment of the formula. BTW, _ is about to be deprecated, and please do not use different assignment operators in one piece of code. If you must use _, put spaces around it. Don't make life unnecessarily hard for your readers. On 7 Jun 2002, Marketa Pavlikova wrote:> > I need a little piece of advice concerning passing data frames > into the functions. As I do a lot of similar fits at a time, I'd like to > write a small function doing the fits for all relevant variables > automatically. However, I usually get error messages of the > following kind: > > (I present here a part of a test code). > > ##################################################### > # Data set: > > ID<-c(1,2,3,4,5) > gender<-c(1,0,0,1,0) > age<-c(25,40,33,50,15) > G1<-c(0,0,1,2,0)#it corresponds to > some gene mutations > G2<-c(0,1,0,1,1)#I examine the > effect of each of them > G3<-c(1,1,1,1,0)#corrected for > "clinical" variables gender and age > response<-c(2.1,3.5,6.1,2.0,1.5) > > dataset<-data.frame(ID,gender,age,G1,G2,G3,response) > GG<-c("G1","G2","G3") > > # here I construct a function that makes a basic fit, > then updates with each variable from GG vector. > > trial_function(mydata,formule,expl,distr="binomial") > { > n_length(expl) > fit.low_glm(formule, family = distr, data = mydata, > na.action = na.exclude) > > for (j in 1:n) > { > fit_update(fit.low,~.+ mydata[,expl[j]]) > print(mydata[,expl[j]]) > } > } > > result<- > trial(mydata=dataset,formule=response~gender+age,exp > l=GG,distr="gaussian") > > # when update is off, no error message is printed and > the function works all right > # if I untag the update, I get the following message > ######Error in eval(expr, envir, enclos) : Object > "mydata" not found > # although it passed and foung mydata correctle > beforehand. > > # If I break the variable passing standards and define > mydata beforehand by > > mydata<-dataset > result<- > trial(mydata=dataset,formule=response~gender+age,exp > l=GG,distr="gaussian") > > # I get > ####Error in "[.data.frame"(mydata, , expl[j]) : > ####Object "expl" not found > > #################################################### > > Hence, it seems to me that there is some problem in passing the > dataset into the update function inside a for cycle. When I did the > same thing outside the function (with the same for cycle) it worked. > Defining the variable outside the update (inside the for cycle) didn't > help. > > Is there any workaround I could use? > > Thank you very much for your help or connection to someone who > could help, > > Marketa Pavlikova > EuroMISE Center > > > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- > r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html > Send "info", "help", or "[un]subscribe" > (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch > _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._ >-- Brian D. Ripley, ripley at stats.ox.ac.uk Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ University of Oxford, Tel: +44 1865 272861 (self) 1 South Parks Road, +44 1865 272860 (secr) Oxford OX1 3TG, UK Fax: +44 1865 272595 -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
I need a little piece of advice concerning passing data frames into the functions. As I do a lot of similar fits at a time, I'd like to write a small function doing the fits for all relevant variables automatically. However, I usually get error messages of the following kind: (I present here a part of a test code). ##################################################### # Data set: ID<-c(1,2,3,4,5) gender<-c(1,0,0,1,0) age<-c(25,40,33,50,15) G1<-c(0,0,1,2,0)#it corresponds to some gene mutations G2<-c(0,1,0,1,1)#I examine the effect of each of them G3<-c(1,1,1,1,0)#corrected for "clinical" variables gender and age response<-c(2.1,3.5,6.1,2.0,1.5) dataset<-data.frame(ID,gender,age,G1,G2,G3,response) GG<-c("G1","G2","G3") # here I construct a function that makes a basic fit, then updates with each variable from GG vector. trial_function(mydata,formule,expl,distr="binomial") { n_length(expl) fit.low_glm(formule, family = distr, data = mydata, na.action = na.exclude) for (j in 1:n) { fit_update(fit.low,~.+ mydata[,expl[j]]) print(mydata[,expl[j]]) } } result<- trial(mydata=dataset,formule=response~gender+age,exp l=GG,distr="gaussian") # when update is off, no error message is printed and the function works all right # if I untag the update, I get the following message ######Error in eval(expr, envir, enclos) : Object "mydata" not found # although it passed and foung mydata correctle beforehand. # If I break the variable passing standards and define mydata beforehand by mydata<-dataset result<- trial(mydata=dataset,formule=response~gender+age,exp l=GG,distr="gaussian") # I get ####Error in "[.data.frame"(mydata, , expl[j]) : ####Object "expl" not found #################################################### Hence, it seems to me that there is some problem in passing the dataset into the update function inside a for cycle. When I did the same thing outside the function (with the same for cycle) it worked. Defining the variable outside the update (inside the for cycle) didn't help. Is there any workaround I could use? Thank you very much for your help or connection to someone who could help, Marketa Pavlikova EuroMISE Center -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._
Thanks for a quick reply!> 1) add1 does this for you, more efficiently!Oh, that's right. Unfortunately, it doesn't solve the problem :(> 2) You are trying to add mydata[,expl[j]]) to a formula. That makes no > sense in the context of the formula, and I think you need to define it > as a variable in your function and then try to add that variable.I did it as well, no help. It tells me that the newly formed variable isn't found. In fact it works normally if outside a function. It think it treats mydata[,expl[j]]) as a variable (it gives that name in the fit output as well).> 3) update within a function is tricky because of the scope rules. It > follows the S scope rules, AFAICS. A much better idea is to add the > variable you want either to the data argument or to the environment of the > formula.Well the scope rules must be the reason (it does the same in S+). But the variable _is_ in the data (it is a part od dataset, put into mydata). In fact all I need to do is just to point at that particular variable from the data set. Maybe there is another means of doing it? I thought about inluding it into the formula, but I don't know how (something like "pasting" together the formulas?)> BTW, _ is about to be deprecated, and please do not use different > assignment operators in one piece of code. If you must use _, put spaces > around it. Don't make life unnecessarily hard for your readers.Oh, in fact the _ part is my colleague's code, I always use <- :) Thanks for advice.> > On 7 Jun 2002, Marketa Pavlikova wrote: > > > > > I need a little piece of advice concerning passing data frames > > into the functions. As I do a lot of similar fits at a time, I'd like to > > write a small function doing the fits for all relevant variables > > automatically. However, I usually get error messages of the > > following kind: > > > > (I present here a part of a test code). > > > > ##################################################### > > # Data set: > > > > ID<-c(1,2,3,4,5) > > gender<-c(1,0,0,1,0) > > age<-c(25,40,33,50,15) > > G1<-c(0,0,1,2,0)#it corresponds to > > some gene mutations > > G2<-c(0,1,0,1,1)#I examine the > > effect of each of them > > G3<-c(1,1,1,1,0)#corrected for > > "clinical" variables gender and age > > response<-c(2.1,3.5,6.1,2.0,1.5) > > > > dataset<-data.frame(ID,gender,age,G1,G2,G3,response) > > GG<-c("G1","G2","G3") > > > > # here I construct a function that makes a basic fit, > > then updates with each variable from GG vector. > > > > trial_function(mydata,formule,expl,distr="binomial") > > { > > n_length(expl) > > fit.low_glm(formule, family = distr, data = mydata, > > na.action = na.exclude) > > > > for (j in 1:n) > > { > > fit_update(fit.low,~.+ mydata[,expl[j]]) > > print(mydata[,expl[j]]) > > } > > } > > > > result<- > > trial(mydata=dataset,formule=response~gender+age,exp > > l=GG,distr="gaussian") > > > > # when update is off, no error message is printed and > > the function works all right > > # if I untag the update, I get the following message > > ######Error in eval(expr, envir, enclos) : Object > > "mydata" not found > > # although it passed and foung mydata correctle > > beforehand. > > > > # If I break the variable passing standards and define > > mydata beforehand by > > > > mydata<-dataset > > result<- > > trial(mydata=dataset,formule=response~gender+age,exp > > l=GG,distr="gaussian") > > > > # I get > > ####Error in "[.data.frame"(mydata, , expl[j]) : > > ####Object "expl" not found > > > > #################################################### > > > > Hence, it seems to me that there is some problem in passing the > > dataset into the update function inside a for cycle. When I did the > > same thing outside the function (with the same for cycle) it worked. > > Defining the variable outside the update (inside the for cycle) didn't > > help. > > > > Is there any workaround I could use? > > > > Thank you very much for your help or connection to someone who > > could help, > > > > Marketa Pavlikova > > EuroMISE Center > > > > > > -.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- > > r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html > > Send "info", "help", or "[un]subscribe" > > (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch > > _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._ > > > > -- > Brian D. Ripley, ripley at stats.ox.ac.uk > Professor of Applied Statistics, http://www.stats.ox.ac.uk/~ripley/ > University of Oxford, Tel: +44 1865 272861 (self) > 1 South Parks Road, +44 1865 272860 (secr) > Oxford OX1 3TG, UK Fax: +44 1865 272595 >-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.-.- r-help mailing list -- Read http://www.ci.tuwien.ac.at/~hornik/R/R-FAQ.html Send "info", "help", or "[un]subscribe" (in the "body", not the subject !) To: r-help-request at stat.math.ethz.ch _._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._._