From deepayan.sarkar at gmail.com  Tue Sep  5 23:09:22 2006
From: deepayan.sarkar at gmail.com (Deepayan Sarkar)
Date: Tue, 5 Sep 2006 14:09:22 -0700
Subject: [Rd] Two submitted packages
In-Reply-To: <20060904231339.BHG87597@po-d.temple.edu>
References: <20060904231339.BHG87597@po-d.temple.edu>
Message-ID: <eb555e660609051409s6c3115cfxdc49031d7f0020a4@mail.gmail.com>

On 9/4/06, Richard M. Heiberger <rmh at temple.edu> wrote:
> ## This example runs in R 2.3.1 and does not run in R 2.4.1.  I am
> ## raising it here for two questions: one on how to debug functions
> ## inside a namespace, the other on how to control clipping.
>
> tmp <- data.frame(x=1:5, y=1:5, a=factor(c(1,1,1,1,1), levels=1:4))
> xyplot(y ~ x,
>        data=tmp, ylim=c(1.5,4.5),
>        panel=function(x,y, ...) {
>          cpv <- current.viewport()
>          cpv$clip <- "off"
>          pushViewport(cpv)
>          panel.xyplot(x, y, ...)
>          popViewport()
>        })
>
> ## R version 2.4.0 Under development (unstable) (2006-08-14 r38872)
> ## gives the error message
> Error in grid.Call.graphics("L_setviewport", pvp, TRUE) :
>         LOGICAL() can only be applied to a 'logical', not a 'character'
> >
>
> ## Question 1.  How do I place a trace() on grid.Call.graphics to make
>
> [snipped]
>
>
> ## Question 2.  How do I control clipping from within a panel
> ## function?  In 2.3.1, both of the following statements run without
> ## error.  Neither of them turns clipping off.
> ##
> ## In 2.4.0, the "off" statement gives the error message above.  The
> ## FALSE statement runs without error, but it didn't turn clipping off.
>
> xyplot(y ~ x | a,
>        data=tmp, ylim=c(1.5,4.5),
>        panel=function(x,y, ...) {
>          cpv <- current.viewport()
>          cpv$clip <- "off"
>          pushViewport(cpv)
>          panel.xyplot(x, y, ...)
>          popViewport()
>        },
>        layout=c(2,2))
>
> xyplot(y ~ x | a,
>        data=tmp, ylim=c(1.5,4.5),
>        panel=function(x,y, ...) {
>          cpv <- current.viewport()
>          cpv$clip <- FALSE
>          pushViewport(cpv)
>          panel.xyplot(x, y, ...)
>          popViewport()
>        },
>        layout=c(2,2))
>
>
> ## ?viewport in 2.4.0 says
> ## clip
> ##
> ## One of "on", "inherit", or "off", indicating whether to clip to the
> ## extent of this viewport, inherit the clipping region from the
> ## parent viewport, or turn clipping off altogether. For
> ## back-compatibility, a logical value of TRUE corresponds to "on" and
> ## FALSE corresponds to "inherit".
>
> ## Notice that "off" is current and FALSE is back-compatible, and
> ## "off" is the value that causes the error.
>
> ## What is the correct way to turn off clipping?

I don't believe there /is/ a documented way.

> ## The way that I would like to use is something on the order of
>
> xyplot(y ~ x | a,
>        data=tmp, ylim=c(1.5,4.5),
>        panel=function(x,y, ...) {
>          panel.xyplot(x, y, ...,
>                       par.settings = list(clip = list(panel = "off")))
>        },
>        layout=c(2,2))
>
> ## I believe par.settings is currently valid only in xyplot() and not
> ## valid in panel functions.  Is my understanding correct?

Yes.

> ## Can the
> ## behavior be changed?

In the original design of lattice, no. In the current design, two
separate viewports exist for each panel (which is why you can use
trellis.focus with clipping turned off). So, there might be a way to
switch to that. A reasonably clean approach might be to do the
following:

xyplot(y ~ x,
       data=tmp, ylim=c(1.5,4.5),
       panel=function(x, y, ...) {
           upViewport()
           downViewport(trellis.vpname("panel",
                                       row = 1, column = 1, clip.off = TRUE))
           panel.xyplot(x, y, ...)
           panel.points(1.4, 1.4)
      })

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 following statement works correctly in both 2.3.1 and 2.4.0.
> ## This statement controls clipping for the entire xyplot, not just
> ## for the single statement within the panel function.
>
> 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.

Deepayan




[Rd] Two submitted packages
Deepayan Sarkar