[R] For Loop

Duncan Murdoch murdoch@dunc@n @end|ng |rom gm@||@com
Sun Sep 23 20:48:52 CEST 2018


On 23/09/2018 2:36 PM, Sorkin, John wrote:
> At the risk of asking something fundamental . . . .
> 
> does log(c1[-1]/c1[-len]
> 
> do the following
> 
> 
> (1) use all elements of c and perform the calculation
> 
> (2) delete the first element of c and perform the calculation,
> 
> (2) delete the first two elements of c and perform the calculation,
> 
>   . . .
> 
> (n) use only the last element of c and perform the calculation.

c1[-1] creates a new vector which is a copy of c1 leaving out element 1, 
and c1[-len] creates a new vector which copies everything except element 
len.  So your (1) is closest to the truth.

It is very similar to (but probably a little faster than)

log(c1[2:len]/c1[1:(len-1)])

There are differences in borderline cases (like length(c1) != len, or 
len < 2) that are not relevant in the original context.

Duncan Murdoch
> 
> 
> Thank you,
> 
> John
> 
> 
> 
> John David Sorkin M.D., Ph.D.
> Professor of Medicine
> Chief, Biostatistics and Informatics
> University of Maryland School of Medicine Division of Gerontology and Geriatric Medicine
> Baltimore VA Medical Center
> 10 North Greene Street
> GRECC (BT/18/GR)
> Baltimore, MD 21201-1524
> (Phone) 410-605-7119
> (Fax) 410-605-7913 (Please call phone number above prior to faxing)
> 
> 
> 
> ________________________________
> From: R-help <r-help-bounces using r-project.org> on behalf of Wensui Liu <liuwensui using gmail.com>
> Sent: Sunday, September 23, 2018 2:26 PM
> To: Ista Zahn
> Cc: r-help using r-project.org
> Subject: Re: [R] For Loop
> 
> CAUTION: This message originated from a non UMB, UMSOM, FPI, or UMMS email system. Whether the sender is known or not known, hover over any links before clicking and use caution opening attachments.
> 
> 
> 
> what you measures is the "elapsed" time in the default setting. you
> might need to take a closer look at the beautiful benchmark() function
> and see what time I am talking about.
> 
> I just provided tentative solution for the person asking for it  and
> believe he has enough wisdom to decide what's best. why bother to
> judge others subjectively?
> On Sun, Sep 23, 2018 at 1:18 PM Ista Zahn <istazahn using gmail.com> wrote:
>>
>> On Sun, Sep 23, 2018 at 1:46 PM Wensui Liu <liuwensui using gmail.com> wrote:
>>>
>>> actually, by the parallel pvec, the user time is a lot shorter. or did
>>> I somewhere miss your invaluable insight?
>>>
>>>> c1 <- 1:1000000
>>>> len <- length(c1)
>>>> rbenchmark::benchmark(log(c1[-1]/c1[-len]), replications = 100)
>>>                    test replications elapsed relative user.self sys.self
>>> 1 log(c1[-1]/c1[-len])          100   4.617        1     4.484    0.133
>>>    user.child sys.child
>>> 1          0         0
>>>> rbenchmark::benchmark(pvec(1:(len - 1), mc.cores = 4, function(i) log(c1[i + 1] / c1[i])), replications = 100)
>>>                                                                 test
>>> 1 pvec(1:(len - 1), mc.cores = 4, function(i) log(c1[i + 1]/c1[i]))
>>>    replications elapsed relative user.self sys.self user.child sys.child
>>> 1          100   9.079        1     2.571    4.138      9.736     8.046
>>
>> Your output is mangled in my email, but on my system your pvec
>> approach takes more than twice as long:
>>
>> c1 <- 1:1000000
>> len <- length(c1)
>> library(parallel)
>> library(rbenchmark)
>>
>> regular <- function() log(c1[-1]/c1[-len])
>> iterate.parallel <- function() {
>>    pvec(1:(len - 1), mc.cores = 4,
>>         function(i) log(c1[i + 1] / c1[i]))
>> }
>>
>> benchmark(regular(), iterate.parallel(),
>>            replications = 100,
>>            columns = c("test", "elapsed", "relative"))
>> ##                 test elapsed relative
>> ## 2 iterate.parallel()   7.517    2.482
>> ## 1          regular()   3.028    1.000
>>
>> Honestly, just use log(c1[-1]/c1[-len]). The code is simple and easy
>> to understand and it runs pretty fast. There is usually no reason to
>> make it more complicated.
>> --Ista
>>
>>> On Sun, Sep 23, 2018 at 12:33 PM Ista Zahn <istazahn using gmail.com> wrote:
>>>>
>>>> On Sun, Sep 23, 2018 at 10:09 AM Wensui Liu <liuwensui using gmail.com> wrote:
>>>>>
>>>>> Why?
>>>>
>>>> The operations required for this algorithm are vectorized, as are most
>>>> operations in R. There is no need to iterate through each element.
>>>> Using Vectorize to achieve the iteration is no better than using
>>>> *apply or a for-loop, and betrays the same basic lack of insight into
>>>> basic principles of programming in R.
>>>>
>>>> And/or, if you want a more practical reason:
>>>>
>>>>> c1 <- 1:1000000
>>>>> len <- 1000000
>>>>> system.time( s1 <- log(c1[-1]/c1[-len]))
>>>>     user  system elapsed
>>>>    0.031   0.004   0.035
>>>>> system.time(s2 <- Vectorize(function(i) log(c1[i + 1] / c1[i])) (1:len))
>>>>     user  system elapsed
>>>>    1.258   0.022   1.282
>>>>
>>>> Best,
>>>> Ista
>>>>
>>>>>
>>>>> On Sun, Sep 23, 2018 at 7:54 AM Ista Zahn <istazahn using gmail.com> wrote:
>>>>>>
>>>>>> On Sat, Sep 22, 2018 at 9:06 PM Wensui Liu <liuwensui using gmail.com> wrote:
>>>>>>>
>>>>>>> or this one:
>>>>>>>
>>>>>>> (Vectorize(function(i) log(c1[i + 1] / c1[i])) (1:len))
>>>>>>
>>>>>> Oh dear god no.
>>>>>>
>>>>>>>
>>>>>>> On Sat, Sep 22, 2018 at 4:16 PM rsherry8 <rsherry8 using comcast.net> wrote:
>>>>>>>>
>>>>>>>>
>>>>>>>> It is my impression that good R programmers make very little use of the
>>>>>>>> for statement. Please consider  the following
>>>>>>>> R statement:
>>>>>>>>           for( i in 1:(len-1) )  s[i] = log(c1[i+1]/c1[i], base = exp(1) )
>>>>>>>> One problem I have found with this statement is that s must exist before
>>>>>>>> the statement is run. Can it be written without using a for
>>>>>>>> loop? Would that be better?
>>>>>>>>
>>>>>>>> Thanks,
>>>>>>>> Bob
>>>>>>>>
>>>>>>>> ______________________________________________
>>>>>>>> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>>>>>>> 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 using r-project.org mailing list -- To UNSUBSCRIBE and more, see
>>>>>>> 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 using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
> 
> 	[[alternative HTML version deleted]]
> 
> ______________________________________________
> R-help using r-project.org mailing list -- To UNSUBSCRIBE and more, see
> 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.
>




More information about the R-help mailing list