From h.wickham at gmail.com  Sat May 12 16:36:03 2007
From: h.wickham at gmail.com (hadley wickham)
Date: Sat, 12 May 2007 16:36:03 +0200
Subject: [Rd] Implicit vs explicit printing and the call stack
Message-ID: <f8e6ff050705120736q754367d9nef4a488c6fa53a03@mail.gmail.com>

Hi everyone,

I've run into a bit of strange problem with implicit vs explicit
printing and the call stack. I've included an example at the bottom of
this email.  The basic problem is that I have an S3 object with a
print method.  When the object is implicitly printed (ie. typed
directly into the console) the function arguments in the call stack
are exploded out to their actual values, rather than just the name I
typed in (see below for an example if my language is confusing).  When
I explicitly "print" the object, the call stack is fine.

This is not just of academic interest, because with a larger dataset
and an implicit print, there is a noticeable delay before control
returns to the prompt  (I can't quantify it exactly because
system.time requires a explicit print, but it's on the order of a few
seconds).

I'm not sure if I've provided enough information to be able to solve
the problem, so please let me know what additional details would be
useful.

Thanks,

Hadley


> ggplot(mtcars, aes(x=cyl, y=-mpg)) + scale_y_log10() + geom_point()
Error in grid.pretty(.$domain()) : infinite axis extents [GEPretty(-inf,inf,5)]
In addition: Warning messages:
1: NaNs produced in: log(x, base)
2: no non-missing arguments to min; returning Inf
3: no non-missing arguments to max; returning -Inf
4: no non-missing arguments to min; returning Inf
5: no non-missing arguments to max; returning -Inf
> traceback()
16: .Call(L_pretty, range)
15: grid.pretty(.$domain())
14: get("breaks", env = .$y(), inherits = TRUE)(.$y(), ...)
13: .$y()$breaks()
12: range(at)
11: as.numeric(x)
10: unit(range(at), "native")
9: ggaxis_line(at, position)
8: ggaxis(.$y()$breaks(), .$y()$labels(), "left", range$y)
7: get("guide_axes", env = coordinates, inherits = TRUE)(coordinates,
       ...)
6: coordinates$guide_axes()
5: guides_basic(plot, scales, cs)
4: ggplot_plot(x, ...)
3: grid.draw(ggplot_plot(x, ...))
2: print.ggplot(list(data = list(mpg = c(21, 21, 22.8, 21.4, 18.7,
   18.1, 14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4,
   14.7, 32.4, 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26,
   30.4, 15.8, 19.7, 15, 21.4), cyl = c(6, 6, 4, 6, 8, 6, 8, 4,
   4, 6, 6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8,
   6, 8, 4), disp = c(160, 160, 108, 258, 360, 225, 360, 146.7,
   140.8, 167.6, 167.6, 275.8, 275.8, 275.8, 472, 460, 440, 78.7,
   75.7, 71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351,
   145, 301, 121), hp = c(110, 110, 93, 110, 175, 105, 245, 62,
   95, 123, 123, 180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150,
   150, 245, 175, 66, 91, 113, 264, 175, 335, 109), drat = c(3.9,
   3.9, 3.85, 3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07,
   3.07, 3.07, 2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 3.15,
   3.73, 3.08, 4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11), wt = c(2.62,
   2.875, 2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44, 3.44,
   4.07, 3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 1.615, 1.835, 2.465,
   3.52, 3.435, 3.84, 3.845, 1.935, 2.14, 1.513, 3.17, 2.77, 3.57,
   2.78), qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84,
   20, 22.9, 18.3, 18.9, 17.4, 17.6, 18, 17.98, 17.82, 17.42, 19.47,
   18.52, 19.9, 20.01, 16.87, 17.3, 15.41, 17.05, 18.9, 16.7, 16.9,
   14.5, 15.5, 14.6, 18.6), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1,
   1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
   1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1), gear = c(4, 4,
   4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3,
   3, 3, 4, 5, 5, 5, 5, 5, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 2,
   2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4,
   6, 8, 2)), layers = list(<environment>), scales = <environment>,
       defaults = list(x = cyl, y = -mpg), title = NULL, fixedaspect = FALSE,
       coordinates = <environment>, formula = ". ~ .", margins = FALSE))
1: print(list(data = list(mpg = c(21, 21, 22.8, 21.4, 18.7, 18.1,
   14.3, 24.4, 22.8, 19.2, 17.8, 16.4, 17.3, 15.2, 10.4, 10.4, 14.7,
   32.4, 30.4, 33.9, 21.5, 15.5, 15.2, 13.3, 19.2, 27.3, 26, 30.4,
   15.8, 19.7, 15, 21.4), cyl = c(6, 6, 4, 6, 8, 6, 8, 4, 4, 6,
   6, 8, 8, 8, 8, 8, 8, 4, 4, 4, 4, 8, 8, 8, 8, 4, 4, 4, 8, 6, 8,
   4), disp = c(160, 160, 108, 258, 360, 225, 360, 146.7, 140.8,
   167.6, 167.6, 275.8, 275.8, 275.8, 472, 460, 440, 78.7, 75.7,
   71.1, 120.1, 318, 304, 350, 400, 79, 120.3, 95.1, 351, 145, 301,
   121), hp = c(110, 110, 93, 110, 175, 105, 245, 62, 95, 123, 123,
   180, 180, 180, 205, 215, 230, 66, 52, 65, 97, 150, 150, 245,
   175, 66, 91, 113, 264, 175, 335, 109), drat = c(3.9, 3.9, 3.85,
   3.08, 3.15, 2.76, 3.21, 3.69, 3.92, 3.92, 3.92, 3.07, 3.07, 3.07,
   2.93, 3, 3.23, 4.08, 4.93, 4.22, 3.7, 2.76, 3.15, 3.73, 3.08,
   4.08, 4.43, 3.77, 4.22, 3.62, 3.54, 4.11), wt = c(2.62, 2.875,
   2.32, 3.215, 3.44, 3.46, 3.57, 3.19, 3.15, 3.44, 3.44, 4.07,
   3.73, 3.78, 5.25, 5.424, 5.345, 2.2, 1.615, 1.835, 2.465, 3.52,
   3.435, 3.84, 3.845, 1.935, 2.14, 1.513, 3.17, 2.77, 3.57, 2.78
   ), qsec = c(16.46, 17.02, 18.61, 19.44, 17.02, 20.22, 15.84,
   20, 22.9, 18.3, 18.9, 17.4, 17.6, 18, 17.98, 17.82, 17.42, 19.47,
   18.52, 19.9, 20.01, 16.87, 17.3, 15.41, 17.05, 18.9, 16.7, 16.9,
   14.5, 15.5, 14.6, 18.6), vs = c(0, 0, 1, 1, 0, 1, 0, 1, 1, 1,
   1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0,
   1), am = c(1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
   1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1), gear = c(4, 4,
   4, 3, 3, 3, 3, 4, 4, 4, 4, 3, 3, 3, 3, 3, 3, 4, 4, 4, 3, 3, 3,
   3, 3, 4, 5, 5, 5, 5, 5, 4), carb = c(4, 4, 1, 1, 2, 1, 4, 2,
   2, 4, 4, 3, 3, 3, 4, 4, 4, 1, 2, 1, 1, 2, 2, 4, 2, 1, 2, 2, 4,
   6, 8, 2)), layers = list(<environment>), scales = <environment>,
       defaults = list(x = cyl, y = -mpg), title = NULL, fixedaspect = FALSE,
       coordinates = <environment>, formula = ". ~ .", margins = FALSE))
> print(ggplot(mtcars, aes(x=cyl, y=-mpg)) + scale_y_log10() + geom_point())
Error in grid.pretty(.$domain()) : infinite axis extents [GEPretty(-inf,inf,5)]
In addition: Warning messages:
1: NaNs produced in: log(x, base)
2: no non-missing arguments to min; returning Inf
3: no non-missing arguments to max; returning -Inf
4: no non-missing arguments to min; returning Inf
5: no non-missing arguments to max; returning -Inf
> traceback()
16: .Call(L_pretty, range)
15: grid.pretty(.$domain())
14: get("breaks", env = .$y(), inherits = TRUE)(.$y(), ...)
13: .$y()$breaks()
12: range(at)
11: as.numeric(x)
10: unit(range(at), "native")
9: ggaxis_line(at, position)
8: ggaxis(.$y()$breaks(), .$y()$labels(), "left", range$y)
7: get("guide_axes", env = coordinates, inherits = TRUE)(coordinates,
       ...)
6: coordinates$guide_axes()
5: guides_basic(plot, scales, cs)
4: ggplot_plot(x, ...)
3: grid.draw(ggplot_plot(x, ...))
2: print.ggplot(ggplot(mtcars, aes(x = cyl, y = -mpg)) + scale_y_log10() +
       geom_point())
1: print(ggplot(mtcars, aes(x = cyl, y = -mpg)) + scale_y_log10() +
       geom_point())



[Rd] Implicit vs explicit printing and the call stack
hadley wickham