2013-05-07 4 views
3

Я использовал здесь код: http://www.sciviews.org/_rgui/tcltk/Radiobuttons.html, чтобы задать вопрос пользователю.Как остановить R при использовании переключателя tcltk?

Но 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

есть простое (и немое) решение: добавьте 'repeat if (! Is.na (testVal)) break' перед' cat (testVal) '... –

ответ

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) 
Смежные вопросы