[R] how to break the loop using sapply?

PO SU rhelpmaillist at 163.com
Fri Oct 10 10:21:23 CEST 2014


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: desolator88 at 163.com 
Majored in Statistics from SJTU




At 2014-10-10 14:44:47, "Hervé Pagès" <hpages at 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: desolator88 at 163.com
>> Majored in Statistics from SJTU
>>
>>
>>
>>
>> At 2014-10-10 13:58:29, "Jeff Newmiller" <jdnewmil at 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:<jdnewmil at 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 <rhelpmaillist at 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: desolator88 at 163.com
>>>> Majored in Statistics from SJTU
>>>> ______________________________________________
>>>> R-help at 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 at 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: hpages at fhcrc.org
>Phone:  (206) 667-5791
>Fax:    (206) 667-1319


More information about the R-help mailing list