【问题标题】:behavior of pipe operator in compostie functions purrr - dplyr复合函数 purrr - dplyr 中管道运算符的行为
【发布时间】:2018-05-10 14:35:07
【问题描述】:

purrr-dplyr 包中管道运算符的使用(简而言之)定义如下:

y%>%f(x,.,z) 与 f(x,y,z) 相同

我正在尝试使用管道运算符执行以下任务。首先,我向您展示不使用管道的任务:

#####for reproducibility
set.seed(50)
z0<-factor(sample(c(letters[1:3],NA),100,replace = T))
###the task
rep(1,length(table(z0)))

现在我想使用管道来做到这一点:

z0%>%table%>%rep(1,length(.))

但是结果不一样。似乎管道运算符无法处理对函数组合的正确分配。那是

y%>%f(x,g(.)) 应该和 f(x,g(y)) 一样

所以,具体的问题是 ti 是否可以做到

y%>%f(x,g(.))

提前感谢您的 cmets。

【问题讨论】:

    标签: r dplyr pipe purrr


    【解决方案1】:

    %&gt;% 实现了第一个参数规则,即如果. 不是直接参数,则将先前的数据作为第一个参数传递给函数;在你的第二种情况下,rep 的参数是1length(.),所以第一个参数规则生效;为避免这种情况,请使用{} 将表达式括起来;你可以阅读更多关于这个at Re-using the placeholder for attributes

    重新使用属性的占位符

    在一个文件中多次使用占位符很简单 右手边的表达式。 但是,当占位符只出现时 在嵌套表达式中,magrittr 仍将应用第一个参数 规则。 原因是在大多数情况下,这会产生更干净的代码。

     x %>% f(y = nrow(.), z = ncol(.)) is equivalent to f(x, y = nrow(x), z = ncol(x))
    

    可以通过将右侧包含在 大括号:

    x %>% {f(y = nrow(.), z = ncol(.))} is equivalent to f(y = nrow(x), z = ncol(x))
    
    rep(1,length(table(z0)))
    # [1] 1 1 1
    

    相当于:

    z0 %>% table %>% {rep(1,length(.))}
    # [1] 1 1 1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-02-06
      • 2018-11-28
      • 1970-01-01
      • 2016-11-21
      • 2021-09-26
      • 2019-11-18
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多