[R] stumped by eval

Ross Boylan ross at biostat.ucsf.edu
Wed Feb 13 05:52:28 CET 2008


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

R package 2.6.1-1 on Debian GNU/Linux.



More information about the R-help mailing list