[R] unexpected behavior of trellis calls inside a user-defined function
Jenny Bryan
jenny at stat.ubc.ca
Fri Mar 23 04:45:39 CET 2007
I got 2 helpful responses (from Deepayan, cc'ed to the list, and
Sundar Dorai-Rah, directly to me). Sundar pointed out something from
the FAQ: inside a function, one must explicitly print lattice/
trellis graph object. It turns out that, at least in the small
example I gave, Sundar's tip was the one that fixed it. The
combination of both fixes got my original, more complicated function
working. Thanks, Jenny
* follow trellis.focus() calls with trellis.unfocus()
* use print(levelplot(...)) inside a function
On 22-Mar-07, at 3:08 PM, Jenny Bryan wrote:
> I am making a battery of levelplots and wireframes for several
> fitted models. I wrote a function that takes the fitted model
> object as the sole argument and produces these plots. Various
> strange behavior ensued, but I have identified one very concrete
> issue (illustrated below): when my figure-drawing function includes
> the addition of points/lines to trellis plots, some of the
> information (main title, placement of additional points) from my i-
> th function call is leaking over into the i+1-th call. In the
> example below, I just get unexpected results. In my actual
> application, it breaks the whole function and one of the error
> messages I've gotten is:
>
> > figFun(smoothFit1) ## no longer worked, once I got fancy with
> trellis
> Error in depth(path) : no applicable method for "depth"
>
> Smallest example I could construct to illustrate at least one of my
> problems:
>
> predVals <-
> expand.grid(list(Sepal.Length = seq(from = min(iris$Sepal.Length),
> to = max(iris$Sepal.Length), length = 50),
> Petal.Length = seq(from = min(iris$Petal.Length),
> to = max(iris$Petal.Length), length = 50)))
> irisFit <- lm(Sepal.Width ~ Sepal.Length * Petal.Length, data = iris)
> predSurf <- data.frame(predVals, Sepal.Width = predict(irisFit,
> predVals))
> trellis.device("X11",width = 8, height = 8)
>
> levelplot(Sepal.Width ~ Sepal.Length * Petal.Length,
> predSurf, main = "Produced at command line, Take 1")
>
> # put levelplot call inside a function
> myFunction <- function(surf) {
> levelplot(Sepal.Width ~ Sepal.Length * Petal.Length,surf,
> main = "Produced by function, Take 1")
> }
> myFunction(predSurf)
> # OK, get the expected figure result
>
> ## now .. what if we add points to the plot?
> levelplot(Sepal.Width ~ Sepal.Length * Petal.Length,
> predSurf, main = "Produced at command line, Take 2")
> trellis.focus("panel", 1, 1) # address the correct part of the
> figure
> lpoints(6,4,pch = 19, cex = 2) # a point appears in correct location
> # I get what I expect
>
> ## any crosstalk from adjacent command line invocations? no
> levelplot(Sepal.Width ~ Sepal.Length * Petal.Length,
> predSurf, main = "Produced at command line, Take 3")
> trellis.focus("panel", 1, 1) # address the correct part of the
> figure
> lpoints(5,2,pch = 19, cex = 2) # a point appears in correct location
> # I get what I expect
>
> # put all this inside a function
> myFunction <- function(surf) {
> levelplot(Sepal.Width ~ Sepal.Length * Petal.Length,surf,
> main = "Produced by function, Take 2")
> trellis.focus("panel", 1, 1) # address the correct part of the
> lpoints(7,5,pch = 19, cex = 2) # a point appears in correct location
> }
> myFunction(predSurf)
> # the title still says "Produced at command line, Take 3"
> # and points appear at (5,2) AND (7,5) ... why?
>
>
>
More information about the R-help
mailing list