[R] Wrong environment when evaluating and expression?

Joshua Wiley jwiley.psych at gmail.com
Wed Jul 6 22:22:31 CEST 2011


Thanks Bill!  That is very useful.  Is the str.language function in
any package (findFn("str.language") came up empty)?  It certainly
helped me, not only to understand this particular problem, but in
trying to wrap my head around language objects (which I only very
poorly grasp) in general.

Josh

On Tue, Jul 5, 2011 at 11:48 AM, William Dunlap <wdunlap at tibco.com> wrote:
>> -----Original Message-----
>> From: r-help-bounces at r-project.org
>> [mailto:r-help-bounces at r-project.org] On Behalf Of Joshua Wiley
>> Sent: Monday, July 04, 2011 1:12 AM
>> To: r-help at r-project.org
>> Subject: [R] Wrong environment when evaluating and expression?
>>
>> Hi All,
>>
>> I have constructed two expressions (e1 & e2).  I can see that they are
>> not identical, but I cannot figure out how they differ.
>>
>> ###############
>> dat <- mtcars
>> e1 <- expression(with(data = dat, lm(mpg ~ hp)))
>> e2 <- as.expression(substitute(with(data = dat, lm(f)),
>> list(f = mpg ~ hp)))
>>
>> str(e1)
>> str(e2)
>> all.equal(e1, e2)
>> identical(e1, e2) # false
>
> With the appended str.language function you can see the difference
> between e1 and e2.  It displays
>  `name` class(length)
> of each component of a recursive object, along with a short text summary
> of
> it after a colon.
>
>> str.language(e1)
> `e1` expression(1): expression(with(data = da...
>  `` call(3): with(data = dat, lm(mpg ~...
>    `` name(1): with
>    `data` name(1): dat
>    `` call(2): lm(mpg ~ hp)
>      `` name(1): lm
>      `` call(3): mpg ~ hp
>        `` name(1): ~
>        `` name(1): mpg
>        `` name(1): hp
>> str.language(e2)
> `e2` expression(1): expression(with(data = da...
>  `` call(3): with(data = dat, lm(mpg ~...
>    `` name(1): with
>    `data` name(1): dat
>    `` call(2): lm(mpg ~ hp)
>      `` name(1): lm
>      `` formula(3): mpg ~ hp
>        `` name(1): ~
>        `` name(1): mpg
>        `` name(1): hp
>        `Attributes of ` list(2): structure(list(class = "f...
>          `class` character(1): "formula"
>          `.Environment` environment(5): <R_GlobalEnv> dat e1 e2 s...
>
> It is a bug in all.equal() that it ignores attributes of formulae.
> E.g.,
>
>  > all.equal(y~x, terms(y~x))
>  [1] TRUE
>  > identical(y~x, terms(y~x))
>  [1] FALSE
>
> Here is str.language
>
> str.language <-
> function (object, ..., level = 0, name = deparse(substitute(object)),
>    attributes = TRUE)
> {
>    abbr <- function(string, maxlen = 25) {
>        if (length(string) > 1 || nchar(string) > maxlen)
>            paste(substring(string[1], 1, maxlen), "...", sep = "")
>        else string
>    }
>    myDeparse <- function(object) {
>        if (!is.environment(object)) {
>            deparse(object)
>        }
>        else {
>            ename <- environmentName(object)
>            if (ename == "")
>                ename <- "<unnamed env>"
>            paste(sep = "", "<", ename, "> ", paste(collapse = " ",
>                objects(object)))
>        }
>    }
>    cat(rep("  ", level), sep = "")
>    if (is.null(name))
>        name <- ""
>    cat(sprintf("`%s` %s(%d): %s\n", abbr(name), class(object),
>        length(object), abbr(myDeparse(object))))
>    a <- attributes(object)
>    if (is.recursive(object) && !is.environment(object)) {
>        object <- as.list(object)
>        names <- names(object)
>        for (i in seq_along(object)) {
>            str.language(object[[i]], ..., level = level + 1,
>                name = names[i], attributes = attributes)
>        }
>    }
>    if (attributes) {
>        a$names <- NULL
>        if (length(a) > 0) {
>            str.language(a, level = level + 1, name = paste("Attributes
> of",
>                abbr(name)), attributes = attributes)
>        }
>    }
> }
>
> Bill Dunlap
> Spotfire, TIBCO Software
> wdunlap tibco.com
>
>>
>> eval(e1)
>> eval(e2)
>> ################
>>
>> The context is trying to use a list of formulae to generate several
>> models from a multiply imputed dataset.  The package I am using (mice)
>> has methods for with() and that is how I can (easily) get the pooled
>> results.  Passing the formula directly does not work, so I was trying
>> to generate the entire call and evaluate it as if I had typed it at
>> the console, but I am missing something (probably rather silly).
>>
>> Thanks,
>>
>> Josh
>>
>>
>> --
>> Joshua Wiley
>> Ph.D. Student, Health Psychology
>> University of California, Los Angeles
>> http://www.joshuawiley.com/
>>
>> ______________________________________________
>> R-help at 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.

-- 
Joshua Wiley
Ph.D. Student, Health Psychology
University of California, Los Angeles
https://joshuawiley.com/



More information about the R-help mailing list