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 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/
Gabor Grothendieck
2011-Jul-04 11:26 UTC
[R] Wrong environment when evaluating and expression?
On Mon, Jul 4, 2011 at 4:11 AM, Joshua Wiley <jwiley.psych at gmail.com> wrote:> 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 > > 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). >In e1, mpg ~ hp is a call object but in e2 its a formula with an environment:> e1[[1]][[3]][[2]]mpg ~ hp> e2[[1]][[3]][[2]]mpg ~ hp> > class(e1[[1]][[3]][[2]])[1] "call"> class(e2[[1]][[3]][[2]])[1] "formula"> > environment(e2[[1]][[3]][[2]])<environment: R_GlobalEnv> -- Statistics & Software Consulting GKX Group, GKX Associates Inc. tel: 1-877-GKX-GROUP email: ggrothendieck at gmail.com
Thanks Gabor, that makes sense now. In case anyone else runs into something similar, I ended up just passing a character string of the formula so it could be coerced to a formula in the correct environment. Thanks again, Josh On Mon, Jul 4, 2011 at 4:26 AM, Gabor Grothendieck <ggrothendieck at gmail.com> wrote:> On Mon, Jul 4, 2011 at 4:11 AM, Joshua Wiley <jwiley.psych at gmail.com> wrote: >> 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 >> >> 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). >> > > In e1, mpg ~ hp is a call object but in e2 its a formula with an environment: > >> e1[[1]][[3]][[2]] > mpg ~ hp >> e2[[1]][[3]][[2]] > mpg ~ hp >> >> class(e1[[1]][[3]][[2]]) > [1] "call" >> class(e2[[1]][[3]][[2]]) > [1] "formula" >> >> environment(e2[[1]][[3]][[2]]) > <environment: R_GlobalEnv> > > -- > Statistics & Software Consulting > GKX Group, GKX Associates Inc. > tel: 1-877-GKX-GROUP > email: ggrothendieck at gmail.com >-- Joshua Wiley Ph.D. Student, Health Psychology University of California, Los Angeles http://www.joshuawiley.com/
William Dunlap
2011-Jul-05 18:48 UTC
[R] Wrong environment when evaluating and expression?
> -----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) # falseWith 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. >
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/
William Dunlap
2011-Jul-06 22:02 UTC
[R] Wrong environment when evaluating and expression?
No, it is not in any package. Feel free to use it as you wish - it has no licensing restrictions. Bill Dunlap Spotfire, TIBCO Software wdunlap tibco.com> -----Original Message----- > From: Joshua Wiley [mailto:jwiley.psych at gmail.com] > Sent: Wednesday, July 06, 2011 1:23 PM > To: William Dunlap > Cc: r-help at r-project.org > Subject: Re: [R] Wrong environment when evaluating and expression? > > 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/ >