线框图(格子包)中的负长度向量是啥意思?
Posted
技术标签:
【中文标题】线框图(格子包)中的负长度向量是啥意思?【英文标题】:What does negative length vectors in a wireframe plot (lattice package) means?线框图(格子包)中的负长度向量是什么意思? 【发布时间】:2012-10-08 15:09:39 【问题描述】:我想使用 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();
我想知道这个错误消息是什么意思,是否有调试的好方法?
提前致谢!
【问题讨论】:
(1)traceback()
可以帮助查明哪里出了问题,(2) 尝试将代码缩减为最简单的数据集并绘制会产生此错误的绘图,然后共享数据与我们一起使用dput
。
问题是,错误打印在图中,而不是在 R 会话中(我使用 source 命令执行脚本),所以 traceback() 根本没有提供任何信息。
一个小问题是,如果您指定data=result_mean
(如您所愿),那么您可以将公式表示为packet~alpha*beta
,这样更具可读性,并且在一般。
【参考方案1】:
调试点阵图形有点困难,因为 (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 分配一个负长度向量,这就是错误的来源。
不过,在这种情况下,我认为诊断比显式调试更有用。
【讨论】:
+1 非常好,关于 lattice 的错误捕获引入的困难非常重要。我从来没有把我的手指放在这一点上,但你是完全正确的。编写我自己的代码时要记住的一些事情。 嗯,我要绘制的数据有点不同。我正在进行一系列的复制实验。每个复制都有一个结果,我想计算结果的平均值并将其与其他实验的其他(平均值)值进行比较。 alpha、beta 值表示从实验到实验的参数设置,数据包值是我感兴趣的平均值。这个想法是分析这个值如何随着不同的参数设置演变。但是,(包含)结果的日志文件非常庞大,我想事先对其进行测试。 嗯,真正的问题是,像上面的二维示例这样的数据是否会在您的实际应用程序中发生,或者是否将数据减少到只有两个点,您是否会减少它有点奇怪@ 987654332@无法处理...以上是关于线框图(格子包)中的负长度向量是啥意思?的主要内容,如果未能解决你的问题,请参考以下文章