On Mon, Aug 30, 2010 at 5:51 AM, Thaler,Thorn,LAUSANNE,Applied
Mathematics <thorn.tha...@rdls.nestle.com> wrote:
>> Well, it's actually lattice:::extend.limits(range(x)), but
>> extendrange() does basically the same thing, and is available to the
>> user (i.e., exported), albeit from a different package.
>
> Thanks again Deepayan for the insight.
>
> A followup question though-- in another setting I'd like to have 
> relation="free" to allow for different x scales. Thus, I can use the prepanel 
> function:
>
> myprepanel <- function(x,y,...) list(xlim=rev(range(x)))
>
> rep(1:10, 100)
> z <- factor(sample(10, 1000, T))
> y <- rnorm(1000, x, as.numeric(z))
>
> xyplot(y~x|z, scales=list(x="free"), prepanel=myprepanel)
>
> which works as expected. But now I want to reverse the x-axis only for 
> specific panels (z %in% 1:9 say). In the above example 'myprepanel' is called 
> 10 times (well actually it is called nlevels(z) times). Hence, my approach 
> would be to include an 'if' clause in the prepanel function and reverse the 
> xlims only for the appropriate panels.
>
> What I usually do in such cases in panel functions (not beautiful but working 
> though) is something like
>
> if (panel.number() == 1)
>  do something
>
> I'm aware that this is maybe not in the spirit of lattice and that this kind 
> of code maybe breaks as soon as the ordering of panels may change. However, 
> it does the trick for panel functions. It does, however, not work for the 
> prepanel since panel.number() is not defined at this stage (well, actually it 
> returns a 0x0 matrix).
>
> Thus, I've three questions:
>
> 1.) How can I achieve different xlims for different panels in an _automatic_ 
> way? What I've done so far is something like
>
> xyplot(y~x|z, scales=list(x="free"), prepanel=myprepanel, xlim=list(NULL, 
> NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, extendrange(x[z==10])))
>
> Thus, for the first 9 panels the xlims are calculated automatically with 
> myprepanel while for the last one I've to provide the limits explicitly. Is 
> there a more elegant way to do this?
>
> 2.) Within a prepanel function: do I have any possibility to get the 
> information for which panel the prepanel function is called?
>
> 2.) Is the only way to adjust the panel function for different panels using 
> panel.number() or is there another (better) way?
>

That is the recommended way for panels.

The only way really to keep track of prepanel calls is to use an
external counter. E.g.,

prepanel.counter <- 0

myprepanel <- function(x,y,...) {
    prepanel.counter <<- prepanel.counter + 1
    list(xlim=rev(range(x)))
}

-Deepayan

______________________________________________
R-help@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.

Reply via email to