6

gWidgets(より具体的には)を使用してRでGUIを作成していgWidgetstcltkます。gdroplistやなどの選択型ウィジェットの内容を更新する方法を知りたいのですがgtable。私は現在、ウィジェットを削除して再作成するというかなりハックな方法を持っています。もっと良い方法があると確信しています。

この簡単な例は、グローバル環境のすべての変数を表示します。

library(gWidgets)
library(gWidgetstcltk)

create.widgets <- function()
{
  grp <- ggroup(container = win)
  ddl <- gdroplist(ls(envir = globalenv()), 
    container = grp)
  refresh <- gimage("refresh", 
    dirname   = "stock",
    container = grp,
    handler   = function(h, ...)
    {
      if(exists("grp") && !is.null(grp)) 
      {
        delete(win, grp)
      }
      create.widgets()   
    }
  )
}

win <- gwindow()
create.widgets()
4

3 に答える 3

4

gWidgets*パッケージの作成者であるJohnVerzaniに話を聞いたところ、答えは非常に単純です(完全に直感的ではありませんが)。リストタイプのウィジェットのコンテンツには、を使用してアクセスしますwidget_name[]

library(gWidgets)
library(gWidgetstcltk)

get_list_content <- function() ls(envir = globalenv())  # or whatever

win <- gwindow()
grp <- ggroup(container = win)
ddl <- gdroplist(get_list_content(), container = grp)
refresh <- gimage("refresh", 
  dirname   = "stock",
  container = grp,
  handler   = function(h, ...) ddl[] <- get_list_content()   
)

いくつかの制限があることに注意してください。ラジオボタンリストは同じ長さのままにする必要があります。

win <- gwindow()
rb <- gradio(1:10, cont = win)
rb[] <- 2:11     # OK
rb[] <- 1:5      # Throws an error; can't change length.
于 2010-05-13T09:31:06.490 に答える
2

これらの更新イベントはウィンドウマネージャーが所有していることが多いので、注意が必要な場合があります。

于 2010-04-21T12:43:06.640 に答える
1

質問のタイトルは、視覚的な更新を強制することについての話なのか、単にコンテンツを変更することについての話なのかはあいまいですが、最近、長時間の操作の前後でgstatusbarの更新に関して同様の問題が発生しました。REventLoopという名前のREPLに代わるものがありますが、tclタイマーの使用は非常に便利であることがわかりました。

tcl("after", 300, my_long_operation)

そのため、長時間の操作の前にgstatusbarを更新し、1秒以内に関数を起動するタイマーを設定します。この関数の最後に、次のようなものを使用してgstatusbarを更新します。

svalue(sb) <- "Ready"
于 2011-10-19T04:46:45.097 に答える