Ross Boylan wrote: > In the following example, the inner evaluation pulls in the global value > of subset (a function) rather than the one I thought I was passing in (a > vector). Can anyone help me understand what's going on, and what I need > to do to fix the problem? > > f0 <- function(formula, data, > subset, na.action > ) > { > f1(formula, data, > subset, na.action > ) > } > > > f1 <- function (formula, data, > subset, na.action > ) > { > mf <- match.call() > mf[[1]] <- as.name("model.frame") > mf <- eval(mf, parent.frame()) > } > > >> netto <- data.frame(Reading=seq(3), Spec=seq(3), Reader=seq(3)) >> t3 <- f0(Reading~0+Spec+Reader, netto, c(1)) >> > Error in xj[i] : invalid subscript type 'closure' > >> traceback() >> > 7: `[.data.frame`(list(Reading = 1:3, Spec = 1:3, Reader = 1:3), > function (x, ...) > UseMethod("subset"), , FALSE) > 6: model.frame.default(formula = formula, data = data, subset = subset, > na.action = na.action) > 5: model.frame(formula = formula, data = data, subset = subset, > na.action = na.action) > 4: eval(expr, envir, enclos) > 3: eval(mf, parent.frame()) > 2: f1(formula, data, subset, na.action) > 1: f0(Reading ~ 0 + Spec + Reader, netto, c(1)) > > I started with a case in which f0 was called with only 2 arguments > (i.e., subset was missing), and that is the case I'm ultimately > interested in. However, even the situation above is failing. > > According to resume, the class of subset is numeric in frames 2 and 4, > but a function in frames 3 and 5. That may be correct for frame 3, > since it is the evaluation function without a named argument subset (and > thus it picks up the global value). But it's wrong for 5 (and higher). > > eval itself is primitive; I don't understand exactly what is going on > with the 2 entries for it (frames 3 + 4). > > Yes, this is elusive, but it is not actually eval() that is doing you in. It is the notion of a model environment, see the last bit of ?formula.
The point is that subset (and offset) arguments are subject to the same evaluation rules as the terms inside the formula: First look in "data", then in the environment of the formula, which in this case is the global environment. This behaviour is generally a good thing because it prevents you from accidentally picking up internal variables of f1, but working around it can be a little painful. As far as I recall, you can use an explicit substitute of the subset argument. > R package 2.6.1-1 on Debian GNU/Linux. > > ______________________________________________ > 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. > -- O__ ---- Peter Dalgaard Ă˜ster Farimagsgade 5, Entr.B c/ /'_ --- Dept. of Biostatistics PO Box 2099, 1014 Cph. K (*) \(*) -- University of Copenhagen Denmark Ph: (+45) 35327918 ~~~~~~~~~~ - ([EMAIL PROTECTED]) FAX: (+45) 35327907 ______________________________________________ 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.