On Dec 19, 2013, at 11:45 AM, William Dunlap wrote: >> Just so I can see if I understand ... that is because `as.name` will >> evaluate `modelType` >> whereas as.name("modelType") would look for the function `modelType` and not >> find >> such a name in the namespace? > > Almost. as.name(modelType) will evaluate modelType so modelType could be a > character string or a name. as.name itself does not do any lookups - that > is eval's job. > When eval() is given a name object it looks it up. > >> So modelType needs to be a language-object and `f` >> needs to be called with: >> >> f(glm, ....) rather than f("glm", ...) > > If you use as.name(modelType) then you could call f("glm",...). > > f(glm, ...) does not pass a name into the function f, it passes in the object > named "glm" (usually the function in package:stats by that name). > as.name(glm) returns garbage. If you wanted to be able to call > f(glm, predictors, response) > you could just use > call[[1]] <- modelType > in f(). I didn't recommend that because then the call attributes of glm's > output > does not look nice. You can write code so that both f("glm",...) and > f(glm,...) work > but I usually prefer not to load up functions with so much heuristic argument > processing (e.g., how should it deal with 'func<-"glm" ; f(func,...)' and the > like).
So by the time the function `f` "saw" its arguments from a call: `f(glm, ...) `, the name of the function would already have been removed and you would just be getting the argument list attached to the function body and as.name() would make a hash of it .... as we saw in the original portion of this question. > > Bill Dunlap > Spotfire, TIBCO Software > wdunlap tibco.com > > >> -----Original Message----- >> From: David Winsemius [mailto:dwinsem...@comcast.net] >> Sent: Thursday, December 19, 2013 11:31 AM >> To: William Dunlap >> Cc: Simon Kiss; r-help@r-project.org >> Subject: Re: [R] Help using mapply to run multiple models >> >> >> On Dec 19, 2013, at 11:10 AM, William Dunlap wrote: >> >>>>> call[[1]] <- quote(modelType) # ' >>> >>> makes call[[1]] the same as as.name("modelType"). You want >>> as.name(modelType). >> >> Just so I can see if I understand ... that is because `as.name` will >> evaluate `modelType` >> whereas as.name("modelType") would look for the function `modelType` and not >> find >> such a name in the namespace? So modelType needs to be a language-object and >> `f` >> needs to be called with: >> >> f(glm, ....) rather than f("glm", ...) >> >> >>> >>> Bill Dunlap >>> Spotfire, TIBCO Software >>> wdunlap tibco.com >>> >>> >>>> -----Original Message----- >>>> From: Simon Kiss [mailto:sjk...@gmail.com] >>>> Sent: Thursday, December 19, 2013 10:56 AM >>>> To: William Dunlap >>>> Cc: Dennis Murphy; r-help@r-project.org >>>> Subject: Re: [R] Help using mapply to run multiple models >>>> >>>> Hello Bill, that is fantastic and it's quite a bit above what I could >>>> write. Is there a way >> to >>>> make the model type an argument to the function so that you can specify >>>> whether >> one is >>>> running glm, lm and such? >>>> I tried to modify it by inserting an argument modelType below, but that >>>> doesn't work. >>>> Yours, simon Kiss >>>>> f <- function (modelType, responseName, predictorNames, data, ..., envir = >>>> parent.frame()) >>>>> { >>>>> call <- match.call() >>>>> call$formula <- formula(envir = envir, paste(responseName, sep = " ~ >>>>> ", >>>>> paste0("`", predictorNames, "`", collapse = " + "))) >>>>> call[[1]] <- quote(modelType) # ' >>>>> call$responseName <- NULL # omit responseName= >>>>> call$predictorNames <- NULL # omit 'predictorNames=' >>>>> eval(call, envir = envir) >>>>> } >>>> On 2013-12-18, at 3:07 PM, William Dunlap <wdun...@tibco.com> wrote: >>>> >>>>> f <- function (responseName, predictorNames, data, ..., envir = >>>>> parent.frame()) >>>>> { >>>>> call <- match.call() >>>>> call$formula <- formula(envir = envir, paste(responseName, sep = " ~ >>>>> ", >>>>> paste0("`", predictorNames, "`", collapse = " + "))) >>>>> call[[1]] <- quote(glm) # 'f' -> 'glm' >>>>> call$responseName <- NULL # omit responseName= >>>>> call$predictorNames <- NULL # omit 'predictorNames=' >>>>> eval(call, envir = envir) >>>>> } >>>>> as in >>>>> z <- lapply(list(c("hp","drat"), c("cyl"), c("am","gear")), >>>>> FUN=function(preds)f("carb", >>>> preds, data=mtcars, family=poisson)) >>>>> lapply(z, summary) >>>> >>>> ********************************* >>>> Simon J. Kiss, PhD >>>> Assistant Professor, Wilfrid Laurier University >>>> 73 George Street >>>> Brantford, Ontario, Canada >>>> N3T 2C9 >>>> Cell: +1 905 746 7606 >>>> >>>> >>> >>> ______________________________________________ >>> R-help@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. >> >> David Winsemius >> Alameda, CA, USA > David Winsemius Alameda, CA, USA ______________________________________________ R-help@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.