使用tcltk单选按钮时如何停止R?

时间:2013-05-07 18:19:46

标签: r

我在这里使用了代码:http://www.sciviews.org/_rgui/tcltk/Radiobuttons.html来询问用户问题。

但是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)

1 个答案:

答案 0 :(得分:5)

您可以创建一个tcl变量的对象done,并使用函数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)