[R] For Loop

Ista Zahn |@t@z@hn @end|ng |rom gm@||@com
Sun Sep 23 21:13:06 CEST 2018


On Sun, Sep 23, 2018 at 2:26 PM Wensui Liu <liuwensui using gmail.com> wrote:
>
> 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'm pretty sure you do not know what you are 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?

You are giving bad and confused advice. Please stop doing that.

--Ista

> 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.




More information about the R-help mailing list