【问题标题】:confusion about purrr::walk关于 purrr::walk 的困惑
【发布时间】:2020-12-25 14:17:09
【问题描述】:

我试图赶上 purrr::walk,但感觉有点困惑。请找到玩具示例,并指出我哪里出错了。

library(purrr)
# ordinary lapply
lp = 1
lp2 <- 
  lapply(1:10, function(c) {
    lp <<- lp + c
    print(lp)
  }) %>% invisible

lp # 56
lp2 # a list up to 56

# purrr::map
mp = 1
mp2 <- 
  map(.x = 1:10,
      .f = function(c) {
              mp <<- mp + c
              print(mp[[1]])
           }
  ) %>% invisible
mp # 56
mp2 # a list up to 56

wk = 1
wk2 <- 
  walk(.x = 1:10, 
       .f = function(c) {
         wk <<- wk +c
         print(wk)
         return(wk)
       })
wk #56
wk2 # a vector up to 10
    # that confuses me, shouldn't it be as much as wk2?

顺便说一下,这么短的例子,它并没有显示出太大的性能差异

library(microbenchmark)
microbenchmark(lp2, mp2, wk2, times = 10000)

#> microbenchmark(lp2, mp2, wk2, times = 10000)
#Unit: nanoseconds
# expr min lq    mean median uq   max neval
#  lp2  39 47 55.1047     49 56 15738 10000
#  mp2  40 47 59.2899     49 56 15661 10000
#  wk2  39 47 57.4763     50 56 15629 10000

【问题讨论】:

  • 根据documentationwalk用于f的副作用并返回输入。在您的示例中,输入是长度为 10 的向量。前两个示例中的 invisible 调用不会像 walk 那样强制返回其输入。您也可以查看源代码。这应该有助于您理解。
  • 是的,你是对的。我应该更仔细地阅读文档。非常感谢。
  • 不用担心。我的 goto 是文档,如果进展不顺利,我会查看源代码。 tidyverse 文档通常都不错。

标签: r purrr


【解决方案1】:

感谢@JosephWood,事实证明我没有仔细阅读文档。 我爱社区!

正如@andrew_reece 所建议的,这是我对这个案例的理解。

purrr::walk 顾名思义,它是一步一步进行的。它关心的是完成分配的所有步骤。至于结果,结果是函数走时出现side effect

因此,返回值只是宣布“我已完成您要求的步骤”。

wk = 1
wk2 <- 
  walk(.x = 1:10, 
       .f = function(c) {
         wk <<- wk +c   ## do something while walking,
                        ## and pass out the result to tell what you've done.
         print(wk)
         return(wk)
       })
wk #56  <- the final result of the side effect.
wk2 # 1 2 3 4 5 6 7 8 9 10
    # I'd finished the 10 steps you asked.

purrr::map 及其兄弟姐妹,如 apply 系列,在特定时间以特定方式专注于执行此操作,并返回它在 marches 转发时获得的值。

【讨论】:

  • 很高兴听到您找到了问题的答案。您会考虑在此答案中为您的编码问题添加实际解决方案吗?事实上,它更像是一个评论而不是一个真正的答案。如果没有明确的编码解决方案,其他来此帖子学习的人可能不会立即了解如何解决自己的问题。
猜你喜欢
  • 2019-05-17
  • 2020-03-06
  • 2016-03-16
  • 2013-07-27
  • 1970-01-01
  • 2012-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多