【发布时间】: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
【问题讨论】:
-
根据documentation,
walk用于f的副作用并返回输入。在您的示例中,输入是长度为 10 的向量。前两个示例中的invisible调用不会像walk那样强制返回其输入。您也可以查看源代码。这应该有助于您理解。 -
是的,你是对的。我应该更仔细地阅读文档。非常感谢。
-
不用担心。我的 goto 是文档,如果进展不顺利,我会查看源代码。
tidyverse文档通常都不错。