当我将它与%>%
一起使用时,我发现purrr :: rerun有一些奇怪的行为,我无法理解。
如果我跑步,
library(purrr)
sample(1:30, 3) %>% rerun(4, .)
它将返回,
# 1 24 5
# 1 24 5
# 1 24 5
# 1 24 5
显然这不是我想要的。
但是,如果我在没有%>%
的情况下运行类似的代码,则它实际上将按预期工作。
rerun(4, sample(1:30, 3))
# 17 5 20
# 13 3 6
# 22 25 3
# 20 30 29
我不明白为什么行为不同。有人可以解释吗?提前致谢。
答案 0 :(得分:2)
函数的调用顺序很重要。在第一种情况下,您要从30个元素中选择3个元素,并调用4次。就像在做
temp <- sample(1:30, 3)
purrr::rerun(4, temp)
因此,无论您调用4次还是1000次,temp
的值都不会改变。
在第二种情况下,您要呼叫sample(1:30, 3)
4次,每次都会给您不同的结果。
答案 1 :(得分:0)
magrittr
不会对点进行延迟计算。
`%foo>%` <- function(e1,e2){
eval.parent(eval(substitute(substitute(e2,list(. = substitute(e1))))))
}
sample(1:30, 3) %foo>% purrr::rerun(4, .)
#> [[1]]
#> [1] 22 25 9
#>
#> [[2]]
#> [1] 14 28 21
#>
#> [[3]]
#> [1] 4 1 25
#>
#> [[4]]
#> [1] 17 2 25
由reprex package(v0.3.0)于2019-09-19创建
这是一种设计选择,它可能是为了避免在使用多个点时出现歧义和效率低下。