4

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")

この最後の削除コマンドを実行すると、作成および削除したすべての小さな円が、触れていなくてもわずかにちらつくことに注意してください。これにより、グラフィック全体が非常に気になります。

それを防ぐ方法はありますか?

どうもありがとう!

4

1 に答える 1

4

@hadley - あなたは上司です!あなたの最初のコメントは正しい答えを提供しました。私はそれをコピーして、将来の参考のためにここに展開しています...

あなたがする必要があるのは、使用することだけです

dev.hold()

# .... do scary modifications ...

dev.flush()

ご褒美に効くようです。また壊れたら再投稿します。

注: これは R v3 以降でのみ使用できます...

于 2013-07-25T18:23:19.710 に答える