[Rd] model.matrix.default chokes on backquote (PR#7202)

Gabor Grothendieck ggrothendieck at myway.com
Sat Aug 28 15:36:12 CEST 2004



> ggrothendieck at myway.com writes:
> 
> > The following gives an error:
> >
> >      > `a(b)` <- 1:4
> >      > `c(d)` <- (1:4)^2
> >      > lm(`a(b)` ~ `c(d)`)
> >      Error in model.matrix.default(mt, mf, contrasts) :
> >      model frame and formula mismatch in model.matrix()
> >
> > To fix it replace this line in model.matrix.default:
> >
> >      reorder <- match(attr(t, "variables")[-1], names(data))
> >
> > with these two lines:
> >
> >      strip.backquote <- function(x) gsub("^`(.*)`", "\\1", x)
> >      reorder <- match(strip.backquote(attr(t, "variables"))[-1],
> >                strip.backquote(names(data)))
> 
> Hmm.. Yes, there's a bug (and it's likely not the only one we have
> relating to odd variable names in model formulas), but I suspect that
> the fix is wrong.
> 
> The backquotes are not part of the variable names, but get added by
> deparsing -- sometimes! Other times they do not: Try for instance
> as.character(quote(`a(b)`)). (Which is as it should be. Other pieces
> of logic relating to nonsyntactical names represent some rather
> awkward compromises.)
> 
> When backquotes have found their way into names(data) or the
> "variables" attribute, I would rather suspect that they were created
> by the wrong tool and fix that, not cure the symptom by stripping them
> off at a later stage.

In model.frame.default there is a line:

   varnames <- as.character(vars[-1])

that turns part of a call object, vars, into a character string.  
We could change that to:

   varnames <- strip.backquote(as.character(as.list(vars[-1])))

or perhaps as.character should not return the backquotes in the
first place in which case the fix would be to fix as.character.



More information about the R-devel mailing list