library(lattice)
pdf("wireframe.pdf")
data(volcano)
foo <-
data.frame(z = as.vector(volcano),
x = rep(1:87, 61),
y = rep(1:61, each = 87))
wireframe(z ~ x * y, foo)
## this used to give an error, but seems fine now (?)
wireframe(z ~ x * y, foo, subset = z > 150)
## Example 1 (a). valgrind shows warnings, starting with
## ==9058== Invalid read of size 8
## ==9058== at 0xA450AFF: wireframePanelCalculations (threeDplot.c:291)
## and subsequently in various other places in that function leading to
## ==9058== Conditional jump or move depends on uninitialised value(s)
## ==9058== at 0x3FFAA466CF: __printf_fp (in /lib64/libc-2.4.so)
## ==9058== by 0x3FFAA423AE: vfprintf (in /lib64/libc-2.4.so)
## ==9058== by 0x3FFAA4A477: fprintf (in /lib64/libc-2.4.so)
## ==9058== by 0x94975BE: PostScriptRLineTo (devPS.c:2683)
## A bit more tracing shows it is accessing element 4016 in an array of
## length 2456, and the plot seems nonsense (and random) when viewed on
## screen. (BDR, 2006/09/17)
## DS's earlier comment: what's this supposed to do ? weird thing is,
## result is random (probably indicator of memory access errors)
if (FALSE)
{
wireframe(z + I(z + 100) ~ x * y, foo,
subset = z > 150,
scales = list(arrows = FALSE))
}
## this works as expected
wireframe(z + I(z + 100) ~ x * y, foo)
## Example 1 (b). Another way of seeing the problem:
## this is OK:
bar <- foo
bar$z[bar$z < 150] <- NA
wireframe(z + I(z + 100) ~ x * y, bar,
scales = list(arrows = FALSE))
## but this is not
if (FALSE)
{
wireframe(z + I(z + 100) ~ x * y,
subset(bar, !is.na(z)),
scales = list(arrows = FALSE))
}
## Example 2. Probably another example of the same "bug": see
## https://stat.ethz.ch/pipermail/r-devel/2005-September/034544.html
n <- 20
psteps <- 50
binomtable <- function(n, psteps)
{
x <- (0:(10*n))/10
p <- (0:psteps)/psteps
dd <- expand.grid(x=x,p=p)
dd$F <- pbinom(dd$x,n,dd$p)
dd$x0 <-trunc(dd$x)
dd
}
bt <- binomtable(n = 5, psteps = 100)
bt[bt$x - bt$x0 >= 0.9, ]$F <- NA
if (FALSE)
{
## this is problematic
wireframe(F ~ x * p, bt,
groups = bt$x0, shade = TRUE,
scales = list(arrows = FALSE))
}
## this one OK
wireframe(F ~ x * p, bt, shade = TRUE,
scales = list(arrows = FALSE))
## this too
wireframe(F ~ x * p | factor(x0), bt,
## groups = bt$x0,
shade = TRUE,
scales = list(arrows = FALSE))
## Working hypothesis: the problem crops up when there are groups
## (specified either directly or through the formula interface) AND x
## and y values for each group don't represent the full evaluation
## grid. The second condition is a bit unclear. In example 2, each
## group's support is disjoint from that of the others. In example 1,
## both groups have the same support, they are just not the full grid.
dev.off()
Add the following code to your website.
For more information on customizing the embed code, read Embedding Snippets.