2013-05-07 33 views
3

我用這裏的代碼:http://www.sciviews.org/_rgui/tcltk/Radiobuttons.html問一個用戶問題。如何在使用tcltk單選按鈕時停止R?

但是R不會等待用戶響應 - 代碼會繼續運行,因此任何後續嘗試使用響應的代碼都會丟失。

這裏是我的完整代碼,我想將testVal存儲起來(這是答案)。

require(tcltk) 
tt <- tktoplevel() 
rb1 <- tkradiobutton(tt) 
rb2 <- tkradiobutton(tt) 
rb3 <- tkradiobutton(tt) 
rb4 <- tkradiobutton(tt) 
rb5 <- tkradiobutton(tt) 
rbValue <- tclVar(NA) 
tkconfigure(rb1,variable=rbValue,value=1) 
tkconfigure(rb2,variable=rbValue,value=2) 
tkconfigure(rb3,variable=rbValue,value=3) 
tkconfigure(rb4,variable=rbValue,value=4) 
tkconfigure(rb5,variable=rbValue,value=5) 

tkgrid(tklabel(tt,text="What's your answer?")) 
tkgrid(tklabel(tt,text="1"),rb1) 
tkgrid(tklabel(tt,text="2"),rb2) 
tkgrid(tklabel(tt,text="3"),rb3) 
tkgrid(tklabel(tt,text="4"),rb4) 
tkgrid(tklabel(tt,text="5"),rb5)    


testVal <- NA 

OnOK <- function() 
{ 
    rbVal <- tclvalue(rbValue) 
    tkdestroy(tt) 
    testVal <<- rbVal 
    print(rbVal) 
    #return(rbVal) 
} 
OK.but <- tkbutton(tt,text="OK",command=OnOK) 
tkgrid(OK.but) 
tkfocus(tt) 

cat(testVal) 
+0

有一個簡單的(和愚蠢的)解決方案:在cat(testVal)之前添加'repeat if(!is.na(testVal))break' ... – 2013-05-07 18:52:37

回答

5

你可以創建一個對象done這是一個Tcl變量和使用功能tkwait.variable告訴R鍵等待進行,直到該變量的變化值。

然後在您的函數OnOK中加入一行,以更改done的值。所以,

## New object 'done' 
done <- tclVar(0) 

OnOK <- function() 
{ 
    rbVal <- tclvalue(rbValue) 
    tkdestroy(tt) 
    testVal <<- rbVal 
    ## When OK button is pressed, value of 'done' is changed 
    tclvalue(done) <- 1 
    print(rbVal) 
    #return(rbVal) 
} 
OK.but <- tkbutton(tt,text="OK",command=OnOK) 
tkgrid(OK.but) 
tkfocus(tt) 

## Tell R to wait for change in value of 'done' 
tkwait.variable(done) 

cat(testVal) 
相關問題