【问题标题】:Combining pipes and the magrittr dot (.) placeholder结合管道和 magrittr 点 (.) 占位符
【发布时间】:2016-08-11 12:47:09
【问题描述】:

我对 R 相当陌生,我正在尝试了解 %>% 运算符和“.”(点)占位符的用法。作为一个简单的例子,下面的代码可以工作

library(magrittr)
library(ensurer)
ensure_data.frame <- ensures_that(is.data.frame(.))
data.frame(x = 5) %>% ensure_data.frame

但是下面的代码失败了

ensure_data.frame <- ensures_that(. %>% is.data.frame)
data.frame(x = 5) %>% ensure_data.frame

我现在将占位符通过管道传输到 is.data.frame 方法中。

我猜是我对点占位符的限制/解释的理解滞后,但有人可以澄清一下吗?

【问题讨论】:

    标签: r dplyr magrittr


    【解决方案1】:

    “问题”是 magrittr 有一个匿名函数的简写符号:

    . %>% is.data.frame
    

    大致相同

    function(.) is.data.frame(.)
    

    换句话说,当点是(最左边的)左侧时,管道具有特殊的行为。

    您可以通过几种方式逃避这种行为,例如

    (.) %>% is.data.frame
    

    或任何其他 LHS 与 . 不同的方式 在这个特定的例子中,这可能看起来是不受欢迎的行为,但在这样的例子中,通常不需要管道第一个表达式,所以is.data.frame(.). %&gt;% is.data.frame 一样具有表达力,并且 像

    这样的例子
    data %>% 
    some_action %>% 
    lapply(. %>% some_other_action %>% final_action)
    

    可以说比

    更清晰
    data %>% 
    some_action %>%
    lapply(function(.) final_action(some_other_action(.)))
    

    【讨论】:

      【解决方案2】:

      这就是问题所在:

      . = data.frame(x = 5)
      a = data.frame(x = 5)
      
      a %>% is.data.frame
      #[1] TRUE
      . %>% is.data.frame
      #Functional sequence with the following components:
      #
      # 1. is.data.frame(.)
      #
      #Use 'functions' to extract the individual functions. 
      

      在我看来像是一个错误,但dplyr 专家可以加入。

      表达式中的一个简单解决方法是使用.[] %&gt;% is.data.frame

      【讨论】:

      • 感谢您澄清这可能是 dplyr 中的不一致以及解决方法!
      猜你喜欢
      • 2014-03-13
      • 2017-10-02
      • 2018-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-13
      • 1970-01-01
      • 2019-07-22
      相关资源
      最近更新 更多