Hello useRs,

I would like to break out of a for loop from within a function upon
some user input. For example, a user hits "Cancel" from a tcl widget called iteratively within a for loop. The for loop then breaks at the current iteration.

I can only seem to get break and stop to work at the top-level.

The following example would make this more clear:


#start tcltk
require(tcltk)

#Define a R+tlk/tk environment from which to obtain user input checktext<-function(event,anchor,text1,text2){ fun.env<-environment() hdr<-paste("You are coding disputed event:",event, "\n\t","located at anchor:",anchor,sep=" ")
     a<-0
     OnAdvance <- function()
     {
        assign("a",tclvalue(tt.acceptval),envir=fun.env)
        tkdestroy(tt)
     }
     OnStop <- function()
     {
 #Here is where the break function is defined for tcl
      break
      tkdestroy(tt)
     }
     tt <- tktoplevel()
     tt.header<- tktext(tt,bg="lightpink",fg="black",width=50,height=5)
tt.text1 <- tktext(tt,bg=gray(.05),font="courier",fg="lightblue",width=50,height=25) tt.text2 <- tktext(tt,bg=gray(.05),font="courier",fg="lightgreen",width=50,height=25)
     tt.accept<-tkcheckbutton(tt,text="Accept Code",width=10)
     tt.acceptval<-tclVar("0")
     tkconfigure(tt.accept,variable=tt.acceptval)
tt.advance<-tkbutton(tt,text="Advance Recon",command=OnAdvance,bg="green")
     tt.stop<-tkbutton(tt,text="Stop Recon",command=OnStop,bg="red")
     tkinsert(tt.header,"end",hdr)
     tkinsert(tt.text1,"end",text1)
     tkinsert(tt.text2,"end",text2)
     tkgrid(tt.header,column=1,row=1,columnspan=3)
     tkgrid(tt.text1,column=2,row=2)
     tkgrid(tt.text2,column=3,row=2)
     tkgrid(tt.accept,column=2,row=4,rowspan=3)
     tkgrid(tt.advance,column=3,row=4,rowspan=3,sticky="w")
     tkgrid(tt.stop,column=3,row=4,sticky="e")
     tkfocus(tt)
     tkwait.window(tt)
     a
  }

#Some arbitrary text to code
event<-"blup"
anchor<-"1234"
text1<-"Batman struck the Riddler with his gauntlet. KAPOW!<anchor=1234>"
text2<-"Batman struck the Riddler with his gauntlet. KAPOW!"

#Ideally, if the user hits "Cancel" the loop would end on the current ith iteration and return to the console
output<-NULL
for(i in 1:3){
output[i]<-checktext(rep(event,3)[i],rep(anchor,3)[i],text1,text2)
}


Regards,
Christopher Marcum
Department of Sociology / Cal(it)^2
University of California - Irvine

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to