【问题标题】:Sample function doesn't work well with purrr::rerun and pipe?示例函数不适用于 purrr::rerun 和管道?
【发布时间】:2019-09-20 15:41:27
【问题描述】:

当 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

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

【问题讨论】:

  • 在提供随机样本数据时请始终使用固定的随机种子(即使用set.seed)。否则我们无法重现您的示例数据和输出。

标签: r purrr magrittr


【解决方案1】:

函数调用的顺序很重要。在第一种情况下,您从 30 个元素中选择 3 个元素并调用它 4 次。就像在做

temp <- sample(1:30, 3)
purrr::rerun(4, temp)

所以无论调用 4 次还是 1000 次,temp 的值都不会改变。

而在第二种情况下,您调用sample(1:30, 3) 4 次,每次都会给您不同的结果。

【讨论】:

    【解决方案2】:

    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 年 9 月 19 日创建

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-10-26
      • 2019-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多