2

我想使用 lattice 包在 R 中绘制线框。但是,我收到以下错误消息“不允许使用数据包 1 负长度向量的错误”。数据如下所示:

> result_mean
  experiment alpha beta   packet
1          0   1.0    1 3.000000
2          0   1.1    1 2.571429

创建数据的命令如下

  png(file=paste("foobar.png"),width=1280, height=1280);
    plot <- wireframe(result_mean$packet ~ result_mean$alpha * result_mean$beta,       
      data=result_mean, scales = list(arrows=FALSE, cex= .45, col = "black", font = 3),
      drape = TRUE, colorkey = TRUE, main = "Foo",
      col.regions = terrain.colors(100),
      screen = list(z = -60, x = -60),
      xlab="alpha", ylab="beta", zlab="mean \npackets");
  print(plot);
  dev.off();

我想知道这个错误消息是什么意思,是否有调试的好方法?

提前致谢!

4

1 回答 1

3

调试点阵图形有点困难,因为 (a) 代码复杂且多层,并且 (b) 错误以一种难以拦截的方式被捕获。但是,您至少可以通过某种方式诊断问题。

首先创建一个最小的例子。我怀疑你的问题是你的数据落在一行上,所以我创建了看起来像这样的数据:

d <- data.frame(x=c(1,1.1),
                y=c(1,1),
                z=c(2,3))

library(lattice)
wireframe(z~y*x,data=d)

现在确认完全三维数据(定义平面的数据)工作正常:

d2 <- data.frame(expand.grid(x=c(1,1.1),
                             y=c(1,1.1)),
                 z=1:4)
wireframe(z~y*x,data=d2) 

所以问题是真的——你打算画一个两点在一条线上的线框吗?如果是这样,你想在情节中出现什么?您可以稍微修改一下以将y值设置为略有不同——不过,我试过了,但没有出现线框(但也没有错误)。

编辑:我做了更多的跟踪,使用各种debug()咒语(并搜索包的源代码lattice及其R本身的“负长度”)来推断以下内容:在一个名为的函数lattice:::panel.3dwire中,有一个对 C 函数的调用wireframePanelCalculations,你可以在https://r-forge.r-project.org/scm/viewvc.php/pkg/src/threeDplot.c?view=markup&root=lattice看到

在这个函数中:

nh = (nx-1) * (ny-1) * ng; /* number of quadrilaterals */
sHeights = PROTECT(allocVector(REALSXP, nh));

在这种情况下nx为零,因此此代码要求 R 分配一个负长度向量,这就是错误的来源。

不过,在这种情况下,我认为诊断比显式调试更有用。

于 2012-10-08T15:34:41.970 回答