[R] Help using mapply to run multiple models

William Dunlap wdunlap at tibco.com
Thu Dec 19 20:45:09 CET 2013


> 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).

Bill Dunlap
Spotfire, TIBCO Software
wdunlap tibco.com


> -----Original Message-----
> From: David Winsemius [mailto:dwinsemius at comcast.net]
> Sent: Thursday, December 19, 2013 11:31 AM
> To: William Dunlap
> Cc: Simon Kiss; r-help at 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:sjkiss at gmail.com]
> >> Sent: Thursday, December 19, 2013 10:56 AM
> >> To: William Dunlap
> >> Cc: Dennis Murphy; r-help at 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 <wdunlap at 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 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.
> 
> David Winsemius
> Alameda, CA, USA



More information about the R-help mailing list