116 lines
2.9 KiB
R
116 lines
2.9 KiB
R
|
|
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()
|