grid:网格图形闪烁

Dan*_*l G 5 r

我正在使用gridR 中的包设计一个交互式绘图。作为交互性的一部分,我反复删除并重新创建绘图的各个部分。然而,网格元素的总数(使用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()
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

全部设置完毕后,在设备上创建一个新的任意方块

grid.rect(height=0.5, width=0.5, gp=gpar(lty = 2), name = "lastShape")
Run Code Online (Sandbox Code Playgroud)

现在尝试删除它

grid.gremove("lastShape")
Run Code Online (Sandbox Code Playgroud)

请注意,当您运行最后一个删除命令时,我创建和删除的所有小圆圈都会轻微闪烁,即使我没有触及它们。这使得整个图形非常分散注意力。

有什么想法可以防止这种情况发生吗?

太感谢了!

Dan*_*l G 5

@hadley - 你这个老大!您的第一条评论提供了正确的答案;我正在复制它并在这里扩展以供将来参考......

您需要做的就是使用

dev.hold()

# .... do scary modifications ...

dev.flush()
Run Code Online (Sandbox Code Playgroud)

看来工作是一种享受。如果再次损坏我会重新发布。

注意:这仅适用于 R v3 及以上版本...