[R] how to break the loop using sapply?

Jeff Newmiller jdnewmil at dcn.davis.CA.us
Fri Oct 10 13:59:59 CEST 2014


Doing as much as possible with vectors instead of loops of a good thing. Fooling yourself that apply functions are vectorized is, well, not a good thing.

If you want to write a function to use instead of sapply, fine, but don't call it *apply because those functions always give you one result for each input item you start with, and anyone who reads your code will be confused if you rename a standard function. I think you need to use ?while.
---------------------------------------------------------------------------
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 10, 2014 1:21:23 AM PDT, PO SU <rhelpmaillist at 163.com> wrote:
>
>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