我想使用网格包在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();
我想知道这个错误信息意味着什么,以及是否有一个好的方法来调试它?
提前致谢!
答案 0 :(得分: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分配一个负长度向量,这是错误的来源。
在这种情况下,我认为诊断比显式调试更有用。