Skip to content

problem using evaluating a formula

2 messages · Gavin Simpson

#
##data
y1 <- matrix(c(3,1,0,1,0,1,1,0,0,0,1,0,0,0,1,1,0,1,1,1),
             nrow = 5, byrow = TRUE)
y2 <- matrix(c
(3,0,10,3,3,0,0,1,1,0,0,0,0,0,1,0,1,0,0,2,1,0,1,1,0,2,1,1,4,1),
             nrow = 5, byrow = TRUE)
y1 <- as.data.frame(y1)
y2 <- as.data.frame(y2)
rownames(y1) <- rownames(y2) <- paste("site", 1:5, sep = "")
colnames(y1) <- paste("spp", 1:4, sep = "")
colnames(y2) <- paste("spp", 1:6, sep = "")

##code
coca.formula <- function(formula, data, ...)
  {
    ##cat("\nusing formula method\n")
    ##browser()
    if (missing(data)) {
        data <- parent.frame()
    }
    m <- match.call(expand.dots = FALSE)
    m$... <- NULL
    m[[1]] <- as.name("model.frame")
## the next line fails
    m <- eval(m, sys.parent())
    Terms <- attr(m, "terms")
    Response <- model.extract(m, "response")
    attr(Terms, "intercept") <- 0
    Predictor <- model.matrix(Terms, m)
    retval <- list(m = m, Terms = Terms, Response = Response,
                   Predictor = Predictor)
    return(retval)
  }

coca(y1 ~ y2, method = "symmetric", symmetric= TRUE)

gives:

Error in model.frame(formula, rownames, variables, varnames, extras,
extranames,  : 
	invalid variable type

when executing the indicated line

now both y1 and y2 are data.frames - this is the natural way of
specifying the model I have in mind - and I think this is the problem as
it seems to be the rhs of the formula that is causing the error.

Is there an alternative way of handling and evaling formulae if the rhs
is a data.frame (if my assumption is correct of course)? I would like,
eventually, to have the option of specifying the predictors as either a
data.frame or via named variables found in the variable passed to data.

A simple alternative would be to do the following:

predictor <- get(as.character(formula[[3]]))
response <- get(as.character(formula[[2]]))

Would I be missing something vital that I'm not appreciating if I used
this simple method?

Any other suggestions gratefully received.

Many thanks in advance,

Gav
#
On Tue, 2005-08-02 at 18:27 +0100, Gavin Simpson wrote:
<snip>
sorry, this should have been:

coca.formula(y1 ~ y2, method = "symmetric", symmetric= TRUE)
<snip>

G