# I have a function that takes a few vectors manipulates them and then outputs a matrix of results: funct1 <- function(eh,be){ ce <- eh+be data.frame(eh,be,ce) } ones <- c(1,1,1) twos <- c(2,2,2) funct1(ones,twos) # I would like to iterate it and save the results from each iteration. I could of course write a loop but I would like to do this is the most efficient way possible. The best I have come up with is this: functM <- function(eh,be,period,endPeriod){ period <- period+1 ce <- eh+be {if (period < endPeriod) functM(ce,be,period,endPeriod) else data.frame(eh,be,ce,period)} } ones <- c(1,1,1) twos <- c(2,2,2) functM(ones,twos,0,4) # As you can see it only reports the results form the last iteration. Here it is the 4th iteration, but if you change the last argument of the previous run of functM, you can see that it will always report the final matrix. How can I have it save/store/write the results of each iteration. I do not care if it stacks it all into the same matrix or if I have to write.csv each time. I just want to do it in the most efficient way possible (the actual program will run for many many iterations of large vectors. # Thanks.
Try Reduce: f <- function(d, incr = 1) with(d, data.frame(eh = ce, be, ce = ce + be, period = period + incr)) d <- data.frame(ce = ones, be = twos, period = 0) Reduce(f, init = d, x = rep(1, 4)) Reduce(f, init = d, x = rep(1, 4), accumulate = TRUE) On Sun, Jun 21, 2009 at 9:06 AM, Economics Guy<economics.guy at gmail.com> wrote:> # I have a function that takes a few vectors manipulates them and then > outputs a matrix of results: > > funct1 <- function(eh,be){ > ? ? ? ?ce <- eh+be > ? ? ? ?data.frame(eh,be,ce) > ? ? ? ?} > > ones <- c(1,1,1) > twos <- c(2,2,2) > funct1(ones,twos) > > > # I would like to iterate it and save the results from each iteration. > I could of course write a loop but I would like to do this is the most > efficient way possible. The best I have come up with is this: > > > functM <- function(eh,be,period,endPeriod){ > ? ? ? ?period <- period+1 > ? ? ? ?ce <- eh+be > ? ? ? ?{if (period < endPeriod) > ? ? ? ? ? ? ? ?functM(ce,be,period,endPeriod) > ? ? ? ? ? ? ? ?else data.frame(eh,be,ce,period)} > ? ? ? ?} > > ones <- c(1,1,1) > twos <- c(2,2,2) > functM(ones,twos,0,4) > > # As you can see it only reports the results form the last iteration. > Here it is the 4th iteration, but if you change the last argument of > the previous run of functM, you can see that it will always report the > final matrix. How can I have it save/store/write the results of each > iteration. I do not care if it stacks it all into the same matrix or > if I have to write.csv each time. I just want to do it in the most > efficient way possible (the actual program will run for many many > iterations of large vectors. > > # Thanks. > > ______________________________________________ > 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. >
Unfortunately my actual function is a bit more complicated than "ce=ce+be" and does many transformations on the original vectors. Maybe something like this better conveys what I am trying to do: functM <- function(eh,be,period,endPeriod){ period <- period+1 ce <- eh+be de <- (eh+be)^2 ee <- ifelse(ce>de,de,ce) {if (period < endPeriod) functM(ce,be,period,endPeriod) else data.frame(eh,be,ce,de,ee,period)} } ones <- c(1,1,1) twos <- c(2,2,2) functM(ones,twos,0,4) On Sun, Jun 21, 2009 at 10:59 AM, Gabor Grothendieck<ggrothendieck at gmail.com> wrote:> Try Reduce: > > f <- function(d, incr = 1) with(d, > ? ? ? ?data.frame(eh = ce, be, ce = ce + be, period = period + incr)) > d <- data.frame(ce = ones, be = twos, period = 0) > Reduce(f, init = d, x = rep(1, 4)) > Reduce(f, init = d, x = rep(1, 4), accumulate = TRUE) > > > On Sun, Jun 21, 2009 at 9:06 AM, Economics Guy<economics.guy at gmail.com> wrote: >> # I have a function that takes a few vectors manipulates them and then >> outputs a matrix of results: >> >> funct1 <- function(eh,be){ >> ? ? ? ?ce <- eh+be >> ? ? ? ?data.frame(eh,be,ce) >> ? ? ? ?} >> >> ones <- c(1,1,1) >> twos <- c(2,2,2) >> funct1(ones,twos) >> >> >> # I would like to iterate it and save the results from each iteration. >> I could of course write a loop but I would like to do this is the most >> efficient way possible. The best I have come up with is this: >> >> >> functM <- function(eh,be,period,endPeriod){ >> ? ? ? ?period <- period+1 >> ? ? ? ?ce <- eh+be >> ? ? ? ?{if (period < endPeriod) >> ? ? ? ? ? ? ? ?functM(ce,be,period,endPeriod) >> ? ? ? ? ? ? ? ?else data.frame(eh,be,ce,period)} >> ? ? ? ?} >> >> ones <- c(1,1,1) >> twos <- c(2,2,2) >> functM(ones,twos,0,4) >> >> # As you can see it only reports the results form the last iteration. >> Here it is the 4th iteration, but if you change the last argument of >> the previous run of functM, you can see that it will always report the >> final matrix. How can I have it save/store/write the results of each >> iteration. I do not care if it stacks it all into the same matrix or >> if I have to write.csv each time. I just want to do it in the most >> efficient way possible (the actual program will run for many many >> iterations of large vectors. >> >> # Thanks. >> >> ______________________________________________ >> 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. >> >
Extend it like this: Try this: f <- function(d, endPeriod) with(d, { period <- period + 1 ce <- eh + be de <- (eh + be)^2 ee <- ifelse(ce > de, de, ce) eh <- ifelse(period < endPeriod, ce, eh) data.frame(eh, be, ce, de, ee, period) }) ones <- c(1, 1, 1) twos <- c(2, 2, 2) d <- data.frame(eh = ones, be = twos, period = 0) Reduce(f, init = d, x = rep(4, 4)) Reduce(f, init = d, x = rep(4, 4), accumulate = TRUE) On Sun, Jun 21, 2009 at 4:49 PM, Economics Guy<economics.guy at gmail.com> wrote:> Unfortunately my actual function is a bit more complicated than > "ce=ce+be" and does many transformations on the original vectors. > Maybe something like this better conveys what I am trying to do: > > functM <- function(eh,be,period,endPeriod){ > ? ? ? ?period <- period+1 > ? ? ? ?ce <- eh+be > ? ? ? ?de <- (eh+be)^2 > ? ? ? ?ee <- ifelse(ce>de,de,ce) > ? ? ? ?{if (period < endPeriod) > ? ? ? ? ? ? ? ?functM(ce,be,period,endPeriod) > ? ? ? ? ? ? ? ?else data.frame(eh,be,ce,de,ee,period)} > ? ? ? ?} > > ones <- c(1,1,1) > twos <- c(2,2,2) > functM(ones,twos,0,4) > > > > > On Sun, Jun 21, 2009 at 10:59 AM, Gabor > Grothendieck<ggrothendieck at gmail.com> wrote: >> Try Reduce: >> >> f <- function(d, incr = 1) with(d, >> ? ? ? ?data.frame(eh = ce, be, ce = ce + be, period = period + incr)) >> d <- data.frame(ce = ones, be = twos, period = 0) >> Reduce(f, init = d, x = rep(1, 4)) >> Reduce(f, init = d, x = rep(1, 4), accumulate = TRUE) >> >> >> On Sun, Jun 21, 2009 at 9:06 AM, Economics Guy<economics.guy at gmail.com> wrote: >>> # I have a function that takes a few vectors manipulates them and then >>> outputs a matrix of results: >>> >>> funct1 <- function(eh,be){ >>> ? ? ? ?ce <- eh+be >>> ? ? ? ?data.frame(eh,be,ce) >>> ? ? ? ?} >>> >>> ones <- c(1,1,1) >>> twos <- c(2,2,2) >>> funct1(ones,twos) >>> >>> >>> # I would like to iterate it and save the results from each iteration. >>> I could of course write a loop but I would like to do this is the most >>> efficient way possible. The best I have come up with is this: >>> >>> >>> functM <- function(eh,be,period,endPeriod){ >>> ? ? ? ?period <- period+1 >>> ? ? ? ?ce <- eh+be >>> ? ? ? ?{if (period < endPeriod) >>> ? ? ? ? ? ? ? ?functM(ce,be,period,endPeriod) >>> ? ? ? ? ? ? ? ?else data.frame(eh,be,ce,period)} >>> ? ? ? ?} >>> >>> ones <- c(1,1,1) >>> twos <- c(2,2,2) >>> functM(ones,twos,0,4) >>> >>> # As you can see it only reports the results form the last iteration. >>> Here it is the 4th iteration, but if you change the last argument of >>> the previous run of functM, you can see that it will always report the >>> final matrix. How can I have it save/store/write the results of each >>> iteration. I do not care if it stacks it all into the same matrix or >>> if I have to write.csv each time. I just want to do it in the most >>> efficient way possible (the actual program will run for many many >>> iterations of large vectors. >>> >>> # Thanks. >>> >>> ______________________________________________ >>> 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. >>> >> >