[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