我正在使用R中的grid
包设计交互式绘图。作为交互性的一部分,我反复删除并重新创建绘图的各个部分。但是,网格元素的总数(使用grid.ls()
命令获得)保持不变;我创建的所有内容都已删除。
问题如下 - 一旦我经历了几个创建和删除周期,我对图形的每次删除,无论多小,都会导致绘图的所有交互部分(我一直在反复删除)闪烁。
这是我能想到的最简单的例子 - 首先运行此代码来设置grid
图形,然后重复删除并重新创建某些元素
library(grid)
pushViewport(viewport())
for (x in seq(0, 1, length=5))
{
for (y in seq(0, 1, length=5))
{
pushViewport(viewport(x = x, y = y, width=1/5, height=1/5, name=paste("foo", x, y, sep="")))
grid.rect()
pushViewport(viewport(x = 0, 0, width=1/4, height=1/4, name="bar1"))
grid.circle(name="testing")
grid.text("123")
upViewport()
pushViewport(viewport(x = 1, 0, width=1/4, height=1/4, name="bar2"))
grid.circle(name="testing")
grid.text("123")
upViewport()
pushViewport(viewport(x = 0, 1, width=1/4, height=1/4, name="bar3"))
grid.circle(name="testing")
grid.text("123")
upViewport()
pushViewport(viewport(x = 1, 1, width=1/4, height=1/4, name="bar4"))
grid.circle(name="testing")
grid.text("123")
upViewport()
upViewport()
}
}
for (i in 1:10)
{
grid.gremove("testing")
for (x in seq(0, 1, length=5))
{
for (y in seq(0, 1, length=5))
{
downViewport(paste("foo", x, y, sep=""))
downViewport("bar1"); grid.circle(name="testing"); upViewport()
downViewport("bar2"); grid.circle(name="testing"); upViewport()
downViewport("bar3"); grid.circle(name="testing"); upViewport()
downViewport("bar4"); grid.circle(name="testing"); upViewport()
upViewport()
}
}
}
完成所有设置后,在设备上创建一个新的任意方块
grid.rect(height=0.5, width=0.5, gp=gpar(lty = 2), name = "lastShape")
现在尝试删除它
grid.gremove("lastShape")
请注意,当您运行最后一个删除命令时,即使我没有触摸它们,我创建和删除的所有小圆圈也会略微闪烁。这使得整个图形非常分散注意力。
任何想法如何预防?
万分感谢!
答案 0 :(得分:4)
@hadley - 你是老板!您的第一条评论提供了正确的答案;我正在复制它并将其扩展到这里以供将来参考......
您需要做的就是使用
dev.hold()
# .... do scary modifications ...
dev.flush()
似乎是一种享受。如果它再次破裂,我会重新发帖。
注意:这仅适用于R v3及以上版本...