2013-05-07 4 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)'앞에'if (! is.na (testVal)) 휴식'을 추가하십시오. –

답변

5

당신은 TCL 변수 인 객체 done를 만들고 그 변수에 값이 변경 될 때까지 계속 기다릴 R에게 기능 tkwait.variable를 사용할 수 있습니다.

그런 다음 값을 변경하는 함수 OnOK에 행을 삽입하십시오. 그래서,

## 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) 
관련 문제