OK, it seems that i misunderstand something, i forget how and when i pick up the monition in my mind that " as possible as avoid using for loop". TKS for all your suggestions! But i still want the way to break sapply, if not exsits now, create it ..... such as: sapply<-function(...){ out<-FALSE ..... if(out==TRUE) return } sapply(1:10, function(i){ if(i=5) out<-TRUE } ) That means to rewrite sapply, and create a virable in it , let called OUT, then mayebe in sapply(1:10,FUN) FUN can use OUT. because i think in sapply, FUN is an inner function,so it can use OUT. when it let OUT=TRUE. sapply should be break..........
-- PO SU mail: desolato...@163.com Majored in Statistics from SJTU At 2014-10-10 14:44:47, "Hervé Pagès" <hpa...@fhcrc.org> wrote: >Hi, > >On 10/09/2014 11:12 PM, PO SU wrote: >> >> >> Is that mean while may be more effient than for in R? as i know, while and >> for are all just functions in R. >> Tks for your suggestion to not use apply that way, but i want to know, if >> possible, is there any way to break it ? > >As Jeff said, you cannot break the loop that happens inside >the sapply() call. Also it is *not* true that for or while are >less efficient than sapply() or lapply(): > > > a <- numeric(100000) > > > system.time(for (i in 1:100000) {a[i] <- i * (i - 1) / 2}) > user system elapsed > 0.148 0.000 0.147 > > > system.time(b <- sapply(1:100000, function(i) {i * (i - 1) / 2})) > user system elapsed > 0.194 0.007 0.201 > > > identical(a, b) >[1] TRUE > > > system.time(c <- unlist(lapply(1:100000, function(i) {i * (i - 1) / 2}))) > user system elapsed > 0.116 0.000 0.119 > > > identical(a, c) >[1] TRUE > >OK lapply() is maybe slightly faster but not significantly. And the >more work you need to do inside the loop, the less significant this >difference will be. > >> Actually, there is a additional question: >> x<- c(3,4,5,6,9) >> sapply(x ,function(i){ >> foo(i) #do something to each value in x,how can i know the i's index in x? >> )} > >You can't. Inside the anonymous function, you only have access to 'i' >which is an element of 'x', not its index in 'x'. > >> In my way , i always >> sapply(seq(x),function(i){ >> foo(x[i]) >> }) > >Yes, if you want to loop on the index instead of the elements, you >need to do something like that. Using seq_along(x) is probably >cleaner than seq(x) for this. > >Cheers, >H. > >> or >> Map( function(i,index){ >> foo(i) # through index to know the i's index in x >> },x ,seq(x)) >> >> How you solve the problem? I mean just use apply functions. >> >> >> >> -- >> >> PO SU >> mail: desolato...@163.com >> Majored in Statistics from SJTU >> >> >> >> >> At 2014-10-10 13:58:29, "Jeff Newmiller" <jdnew...@dcn.davis.ca.us> wrote: >>> Don't use apply functions if you want to do what you describe. They don't >>> work that way. Use a while control structure. >>> >>> --------------------------------------------------------------------------- >>> Jeff Newmiller The ..... ..... Go Live... >>> DCN:<jdnew...@dcn.davis.ca.us> Basics: ##.#. ##.#. Live Go... >>> Live: OO#.. Dead: OO#.. Playing >>> Research Engineer (Solar/Batteries O.O#. #.O#. with >>> /Software/Embedded Controllers) .OO#. .OO#. rocks...1k >>> --------------------------------------------------------------------------- >>> Sent from my phone. Please excuse my brevity. >>> >>> On October 9, 2014 10:24:49 PM PDT, PO SU <rhelpmaill...@163.com> wrote: >>>> >>>> Dear expeRts, >>>> i use sapply for loop, and i want to break it when i needed, how to >>>> do that? e.g. >>>> >>>> sapply( 1:10, function(i) { >>>> if(i==5) break and jump out of the function sapply >>>> } ) >>>> >>>> I want to do it because i have to loop 1000000 times, but i don't know >>>> when it will break, that means, it may need break at i=5 or at i=50000, >>>> for the possible of the last case, i don't use for loop, because it >>>> slow(is it right?). >>>> So,if you happen to know it ,may you help me? >>>> >>>> >>>> -- >>>> >>>> PO SU >>>> mail: desolato...@163.com >>>> Majored in Statistics from SJTU >>>> ______________________________________________ >>>> 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. >>> >> ______________________________________________ >> 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. >> > >-- >Hervé Pagès > >Program in Computational Biology >Division of Public Health Sciences >Fred Hutchinson Cancer Research Center >1100 Fairview Ave. N, M1-B514 >P.O. Box 19024 >Seattle, WA 98109-1024 > >E-mail: hpa...@fhcrc.org >Phone: (206) 667-5791 >Fax: (206) 667-1319 ______________________________________________ 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.