Christopher Marcum
2008-Nov-24 02:02 UTC
[R] breaking out of a loop from within a function
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