Re: [Rd] Two submitted packages

From: Richard M. Heiberger <rmh_at_temple.edu>
Date: Wed 06 Sep 2006 - 02:30:31 GMT


Deepayan wrote:

> > xyplot(y ~ x | a,
> >        data=tmp, ylim=c(1.5,4.5),
> >        par.settings = list(clip = list(panel = "off")),
> >        layout=c(2,2))
> 
> I'm curious to know why this functionality is not enough.


## 1. Here is a more realistic example.

tmp <- data.frame(x=1:5, y=1:5, a=factor(c(1,1,1,1,1), levels=1:4))

## This gives what I want.
## It looks like the upViewport/downViewport sequence is the control I
## should be using. If this is a stable sequence, it answers my needs.
xyplot(y ~ x,

       data=tmp, ylim=c(1.5,4.5),
       panel=function(...) {
          panel.xyplot(...)
            upViewport()
            downViewport(trellis.vpname("panel",
                                        row = 1, column = 1, clip.off = TRUE))
          panel.axis(side="right", outside=TRUE)
       },
       layout=c(2,2),
       main="right axis visible by control, points clipped by default")

## If I turned off clipping at the top, I would get the unwanted points
## plotted outside the figure region.

xyplot(y ~ x,

       data=tmp, ylim=c(1.5,4.5),
       par.settings = list(clip = list(panel = "off")),
       panel=function(...) {
          panel.xyplot(...)
          panel.axis(side="right", outside=TRUE)
       },
       layout=c(2,2),
       main="right axis visible by control, points not clipped")


## this is what happens if I don't do any control of clipping
xyplot(y ~ x,

       data=tmp, ylim=c(1.5,4.5),
       panel=function(...) {
          panel.xyplot(...)
          panel.axis(side="right", outside=TRUE)
       },
       layout=c(2,2),
       main="right axis invisible by clipping, points clipped by default")


## This doesn't work, but it illustrates the syntax I would like.
xyplot(y ~ x,

       data=tmp, ylim=c(1.5,4.5),
       panel=function(...) {
          panel.xyplot(...)
          panel.axis(side="right", outside=TRUE, clip="off")
       },
       layout=c(2,2),
       main="right axis visible by control, points clipped by default")




## 2

> Unfortunately, there is currently no easy way to find out which column
> and row the current panel occupies. I plan to make some changes before
> R 2.4.0 is released that should expose that information, so please try
> again in a few weeks.

The way I have been using is to back up the calling sequence and use statements like
{

    ## This loop is needed because
    ##    console usage has i=2,
    ##    Rcmdr script window has i=5,
    ##    Rcmdr justDoIt has i=20
    for (i in seq(2, length=30)) {
      sf2 <- sys.frame(i)
      column.tmp <- try(get("column", pos=sf2), silent=TRUE)
      if (class(column.tmp) != "try-error") break
    }
    if (class(column.tmp) == "try-error")       stop("panel.interaction2wt is too deeply nested in the system stack.")     row <- get("row", pos=sf2)
    column <- get("column", pos=sf2)
    cols.per.page <- get("cols.per.page", pos=sf2)
    rows.per.page <- get("rows.per.page", pos=sf2)
  }

## A cleaner way would be preferable. Will the above stay valid? The
## need for a loop to find out how far up the calling sequence to go
## caught me by surprise. I don't understand why generating commands

## the way Rcmdr does it should have an effect on the depth of the
## calling sequence.



R-devel@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-devel Received on Wed Sep 06 12:36:23 2006

Archive maintained by Robert King, hosted by the discipline of statistics at the University of Newcastle, Australia.
Archive generated by hypermail 2.1.8, at Wed 06 Sep 2006 - 11:39:29 GMT.

Mailing list information is available at https://stat.ethz.ch/mailman/listinfo/r-devel. Please read the posting guide before posting to the list.