Jens_Praestgaard@hgsi.com
2004-Mar-10 16:13 UTC
[R] Question concerning library function "nlme" and lexical scoping
I am running into problems calling the library function nlme from within another function. Basically,the following function (with v a list containing data and initialization values)> testfuncfunction(dat=v) { test<-nlsList(result~a+(b-a)/(1+(conc/(c+z*cdiff))^d) |rep,start=dat$init,data=dat$mixeddat) return(nlme(test,random=b~1)) } produces the error message Error in eval(expr, envir, enclos) : Object "dat" not found. However, if the assignment dat<-v is done globally, then testfunc() produces the desired mixed model analysis. As I understand lexical scoping, the nlme function should take the value of "dat" from the calling environment through its "data = sys.frame(sys.parent ())" argument. Instead it seems to only recognize dat if it is defined globally. Thank you. Jens Praestgaard Human Genome Sciences
Prof Brian Ripley
2004-Mar-10 18:07 UTC
[R] Question concerning library function "nlme" and lexical scoping
On Wed, 10 Mar 2004 Jens_Praestgaard at hgsi.com wrote:> I am running into problems calling the library function nlme from within > another function. Basically,the following function (with v a list > containing data and initialization values) > > > testfunc > function(dat=v) { > test<-nlsList(result~a+(b-a)/(1+(conc/(c+z*cdiff))^d) > |rep,start=dat$init,data=dat$mixeddat) > return(nlme(test,random=b~1)) > } > produces the error message > > Error in eval(expr, envir, enclos) : Object "dat" not found. > > However, if the assignment dat<-v is done globally, then testfunc() > produces the desired mixed model analysis. > > As I understand lexical scoping, the nlme function should take the value of > "dat" from the calling environment through its "data = sys.frame(sys.parent > ())" argument. Instead it seems to only recognize dat if it is defined > globally.Let's be careful. Lexical scoping is to do with where a function is defined, so the lexical scope for nlme() is namespace:nlme. That's not pertinent here. But if you do traceback() you will see that nlme is not looking in data for dat, but using the result `test'. I would need a working example to be sure enough of what is going on. http://developer.r-project.org/nonstandard-eval.pdf may be instructive. nlme is particularly non-standard as it has to deal with several formulae, and get them in several ways. -- 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 272866 (PA) Oxford OX1 3TG, UK Fax: +44 1865 272595