On Oct 31, 2013, at 1:27 PM, Andreas Leha wrote: > Hi all, > > what is the recommended way to quickly (and without much burden on the > memory) extract the response from a formula?
If you want its expression value its just form[[2]] If you wnat it evaluated in the environment of a dataframe then this should be fairly efficient: x <- stats::runif(20) y <- stats::runif(20) dfrm <- data.frame(x=x,y=y) extractResponse <- function(frm, dat) { resp <- frm[[2]]; print(resp) # that's optional fdat <- eval(resp, envir=dat); return(fdat) } > extractResponse(y ~. , dat=dfrm) y [1] 0.80458147 0.90447989 0.54874785 0.04227895 0.11540969 0.98003767 0.37372573 0.58013515 [9] 0.47227247 0.22361616 0.45076628 0.57091106 0.36290661 0.69673890 0.87650224 0.96496587 [17] 0.14923759 0.25083936 0.32139801 0.91958308 > > The standard way to extract the response from a formula seems to be via > model.frame() or model.extract(), but that is very memory intensive. > > Here is a quick example, that (BEWARE) consumes a lot of memory: > > --8<---------------cut here---------------start------------->8--- > require("ALL") > data("ALL") > y <- pData(ALL)$sex > x <- t(exprs(ALL)) > mf <- cbind(as.data.frame(x), y=y) > > extractResponse <- function(formula, data) > { > m <- match.call(expand.dots = FALSE) > m[[1L]] <- quote(stats::model.frame) > m <- eval.parent(m) > y <- model.extract(m, "response") > > y > } > extractResponse(y~., data=mf) > > extractResponseFast <- function(formula, data) > { > y <- eval(as.symbol(as.character(formula)[2]), > environment(formula)) > > y > } > extractResponseFast(y~., data=mf) > --8<---------------cut here---------------end--------------->8--- > > > > Or, to put my question differently, is the following approach > robust? > > --8<---------------cut here---------------start------------->8--- > require("ALL") > data("ALL") > y <- pData(ALL)$sex > x <- t(exprs(ALL)) > mf <- cbind(as.data.frame(x), y=y) > > extractResponseFast <- function(formula, data) > { > y <- eval(as.symbol(as.character(formula)[2]), > environment(formula)) > > y > } > extractResponseFast(y~., data=mf) > --8<---------------cut here---------------end--------------->8--- > > > Many thanks in advance! > > Regards, > Andreas > > ______________________________________________ > 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 ______________________________________________ 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.