Rパッケージ用のGUIを(gWidgetsを使用して)開発しようとしています。私の計画は、データを保持し、関数ごとに小さなGUIラッパーを呼び出すボタンを備えたメインウィンドウを構築することでした。残念ながら、私は基本的な(?)問題で立ち往生しています-データを転送する方法がわかりません。
質問:
- 別々のウィンドウ間でデータを適切に送信するにはどうすればよいですか?
- 別のウィンドウのハンドラー内からデータを送信するにはどうすればよいですか?
私の問題は次のような ものです。gWidgetsを使用してRに変数をロードおよび保存しますが、私が読んだことから、.GlobalEnvの使用はお勧めしません。
また、<<-演算子を使用している人を見たことがあります:http://www.mail-archive.com/r-sig-gui@r-project.org/msg00053.html、しかし私はそれを正しく再現することができません(そして私の例ではうまくいきません)。
以下は簡単な例です。ここでは、テキストを別のウィンドウに送信し、ボタンが押された場合に再度送信しようとしています。ハンドラー内でreturnを試してみましたが、機能しません(許可されているかどうかもわかりません)。サブウィンドウは、ハンドラー/内部関数がデータに作用する前に、関数の最後ですぐにその値を返します。ハンドラーからメインウィンドウにアクセスする方法がわかりません。
main <- function(){
library(gWidgets)
options(guiToolkit="RGtk2")
w <- gwindow(title="Main window",
visible=FALSE)
txt <- gtext(text="Initial text in main window.",
container=w)
btn <- gbutton("Send to sub window", container=w)
addHandlerChanged(btn, handler = function(h, ...) {
shouldbenew <- subwindow(svalue(txt))
svalue(txt) <- paste("The sub window immediately returns 'TRUE', before pushing 'Return to main':", shouldbenew )
} )
visible(w) <- TRUE
}
subwindow<- function(text){
library(gWidgets)
options(guiToolkit="RGtk2")
sw <- gwindow(title="Sub window",
visible=FALSE)
editedtxt <- gtext(text=paste(text, "- Text is transferred to the sub window, but I don't know how to send it back to the main window"),
container=sw)
btn <- gbutton("Send to main window", container=sw)
addHandlerChanged(btn, handler = function(h, ...) {
newtxt <- svalue(editedtxt)
return(newtxt)
} )
visible(sw) <- TRUE
}
更新: 上記の例を使用して説明した、(jverzaniによって提案された)前進の方法として私が選んだ解決策は次のとおりです。提案された解決策を正しく理解し、それを「素晴らしい」方法で実装し、理想的にはCRANで受け入れられたことを願っています。
要約すると、メインウィンドウ環境内に新しい環境を作成しました。サブウィンドウを編集して、呼び出しの環境を取得しました。サブウィンドウのボタンを押すと、assign
編集されたテキストが渡された環境に送られます。サブウィンドウを閉じてメインウィンドウにフォーカスを合わせると、編集したテキストに環境から。を使用してアクセスできますget
。
main <- function(){
library(gWidgets)
options(guiToolkit="RGtk2")
# Create a new environment for passing data.
.mainGlobal <- new.env()
w <- gwindow(title="Main window", visible=FALSE)
txt <- gtext(text="Initial text in main window.",
container=w)
btn <- gbutton("Send to sub window", container=w)
addHandlerChanged(btn, handler = function(h, ...) {
# Call sub widget passing text and environment.
subwindow(text=svalue(txt), env=.mainGlobal)
} )
visible(w) <- TRUE
addHandlerFocus(w, handler = function (h, ...) {
if(exists("myText", envir=.mainGlobal)){
# Retrieve text and update.
svalue(txt) <- get("myText", envir=.mainGlobal)
}
})
}
subwindow<- function(text, env=NULL){
library(gWidgets)
options(guiToolkit="RGtk2")
sw <- gwindow(title="Sub window", visible=FALSE)
editedtxt <- gtext(text=text, container=sw)
btn <- gbutton("Send to main window", container=sw)
addHandlerChanged(btn, handler = function(h, ...) {
newtxt <- svalue(editedtxt)
assign("myText", newtxt, envir=env)
} )
visible(sw) <- TRUE
}