样本函数在purrr :: rerun和pipe中不能很好地工作?

时间:2019-09-17 01:52:48

标签: r purrr magrittr

当我将它与%>%一起使用时,我发现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

我不明白为什么行为不同。有人可以解释吗?提前致谢。

2 个答案:

答案 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创建

这是一种设计选择,它可能是为了避免在使用多个点时出现歧义和效率低下。