[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