R: How to output a recursive or iterative function/map output into a vector?











up vote
1
down vote

favorite












I'd like to feed the output of a user-defined function back to its input (a recursive map), run this iteration N times, and save the output of every iteration in a vector. This is simple to do with "for" loop



my_fun <- function(x) {x/3 +1} # a user-defined function (trivial example)

my_l <- c()

x <- 0 # initial condition

for(i in 1:10) {
x <- my_fun(x)
my_l[i] <- x
}

print(my_l)

>[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975


The above works but seems crude. Is there a shorter way to do it? Perhaps with tidyverse/purrr?










share|improve this question


























    up vote
    1
    down vote

    favorite












    I'd like to feed the output of a user-defined function back to its input (a recursive map), run this iteration N times, and save the output of every iteration in a vector. This is simple to do with "for" loop



    my_fun <- function(x) {x/3 +1} # a user-defined function (trivial example)

    my_l <- c()

    x <- 0 # initial condition

    for(i in 1:10) {
    x <- my_fun(x)
    my_l[i] <- x
    }

    print(my_l)

    >[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975


    The above works but seems crude. Is there a shorter way to do it? Perhaps with tidyverse/purrr?










    share|improve this question
























      up vote
      1
      down vote

      favorite









      up vote
      1
      down vote

      favorite











      I'd like to feed the output of a user-defined function back to its input (a recursive map), run this iteration N times, and save the output of every iteration in a vector. This is simple to do with "for" loop



      my_fun <- function(x) {x/3 +1} # a user-defined function (trivial example)

      my_l <- c()

      x <- 0 # initial condition

      for(i in 1:10) {
      x <- my_fun(x)
      my_l[i] <- x
      }

      print(my_l)

      >[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975


      The above works but seems crude. Is there a shorter way to do it? Perhaps with tidyverse/purrr?










      share|improve this question













      I'd like to feed the output of a user-defined function back to its input (a recursive map), run this iteration N times, and save the output of every iteration in a vector. This is simple to do with "for" loop



      my_fun <- function(x) {x/3 +1} # a user-defined function (trivial example)

      my_l <- c()

      x <- 0 # initial condition

      for(i in 1:10) {
      x <- my_fun(x)
      my_l[i] <- x
      }

      print(my_l)

      >[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975


      The above works but seems crude. Is there a shorter way to do it? Perhaps with tidyverse/purrr?







      r loops recursion purrr






      share|improve this question













      share|improve this question











      share|improve this question




      share|improve this question










      asked Nov 5 at 17:00









      Irakli

      314210




      314210
























          1 Answer
          1






          active

          oldest

          votes

















          up vote
          4
          down vote



          accepted










          We can use accumulate



          library(tidyverse)
          accumulate(1:10, ~ my_fun(.x), .init = 1)
          #[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975 1.499992




          Or with Reduce from base R



          Reduce(function(x, y) my_fun(x), 1:10, init = 1, accumulate = TRUE)





          share|improve this answer





















            Your Answer






            StackExchange.ifUsing("editor", function () {
            StackExchange.using("externalEditor", function () {
            StackExchange.using("snippets", function () {
            StackExchange.snippets.init();
            });
            });
            }, "code-snippets");

            StackExchange.ready(function() {
            var channelOptions = {
            tags: "".split(" "),
            id: "1"
            };
            initTagRenderer("".split(" "), "".split(" "), channelOptions);

            StackExchange.using("externalEditor", function() {
            // Have to fire editor after snippets, if snippets enabled
            if (StackExchange.settings.snippets.snippetsEnabled) {
            StackExchange.using("snippets", function() {
            createEditor();
            });
            }
            else {
            createEditor();
            }
            });

            function createEditor() {
            StackExchange.prepareEditor({
            heartbeatType: 'answer',
            convertImagesToLinks: true,
            noModals: true,
            showLowRepImageUploadWarning: true,
            reputationToPostImages: 10,
            bindNavPrevention: true,
            postfix: "",
            imageUploader: {
            brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
            contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
            allowUrls: true
            },
            onDemand: true,
            discardSelector: ".discard-answer"
            ,immediatelyShowMarkdownHelp:true
            });


            }
            });














             

            draft saved


            draft discarded


















            StackExchange.ready(
            function () {
            StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53158901%2fr-how-to-output-a-recursive-or-iterative-function-map-output-into-a-vector%23new-answer', 'question_page');
            }
            );

            Post as a guest
































            1 Answer
            1






            active

            oldest

            votes








            1 Answer
            1






            active

            oldest

            votes









            active

            oldest

            votes






            active

            oldest

            votes








            up vote
            4
            down vote



            accepted










            We can use accumulate



            library(tidyverse)
            accumulate(1:10, ~ my_fun(.x), .init = 1)
            #[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975 1.499992




            Or with Reduce from base R



            Reduce(function(x, y) my_fun(x), 1:10, init = 1, accumulate = TRUE)





            share|improve this answer

























              up vote
              4
              down vote



              accepted










              We can use accumulate



              library(tidyverse)
              accumulate(1:10, ~ my_fun(.x), .init = 1)
              #[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975 1.499992




              Or with Reduce from base R



              Reduce(function(x, y) my_fun(x), 1:10, init = 1, accumulate = TRUE)





              share|improve this answer























                up vote
                4
                down vote



                accepted







                up vote
                4
                down vote



                accepted






                We can use accumulate



                library(tidyverse)
                accumulate(1:10, ~ my_fun(.x), .init = 1)
                #[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975 1.499992




                Or with Reduce from base R



                Reduce(function(x, y) my_fun(x), 1:10, init = 1, accumulate = TRUE)





                share|improve this answer












                We can use accumulate



                library(tidyverse)
                accumulate(1:10, ~ my_fun(.x), .init = 1)
                #[1] 1.000000 1.333333 1.444444 1.481481 1.493827 1.497942 1.499314 1.499771 1.499924 1.499975 1.499992




                Or with Reduce from base R



                Reduce(function(x, y) my_fun(x), 1:10, init = 1, accumulate = TRUE)






                share|improve this answer












                share|improve this answer



                share|improve this answer










                answered Nov 5 at 17:02









                akrun

                387k13174250




                387k13174250






























                     

                    draft saved


                    draft discarded



















































                     


                    draft saved


                    draft discarded














                    StackExchange.ready(
                    function () {
                    StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53158901%2fr-how-to-output-a-recursive-or-iterative-function-map-output-into-a-vector%23new-answer', 'question_page');
                    }
                    );

                    Post as a guest




















































































                    這個網誌中的熱門文章

                    Xamarin.form Move up view when keyboard appear

                    Post-Redirect-Get with Spring WebFlux and Thymeleaf

                    Anylogic : not able to use stopDelay()