Combining pipes and the magrittr dot (.) placeholder

后端 未结 2 431
谎友^
谎友^ 2020-12-19 06:37

I am fairly new to R and I am trying to understand the %>% operator and the usage of the \" .\" (dot) placeholder. As a simple example the follo

相关标签:
2条回答
  • 2020-12-19 06:42

    The "problem" is that magrittr has a short-hand notation for anonymous functions:

    . %>% is.data.frame
    

    is roughly the same as

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

    In other words, when the dot is the (left-most) left-hand side, the pipe has special behaviour.

    You can escape the behaviour in a few ways, e.g.

    (.) %>% is.data.frame
    

    or any other way where the LHS is not identical to . In this particular example, this may seem as undesirable behaviuour, but commonly in examples like this there's really no need to pipe the first expression, so is.data.frame(.) is as expressive as . %>% is.data.frame, and examples like

    data %>% 
    some_action %>% 
    lapply(. %>% some_other_action %>% final_action)
    

    can be argued to be clearner than

    data %>% 
    some_action %>%
    lapply(function(.) final_action(some_other_action(.)))
    
    0 讨论(0)
  • 2020-12-19 06:46

    This is the problem:

    . = 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. 
    

    Looks like a bug to me, but dplyr experts can chime in.

    A simple workaround in your expression is to do .[] %>% is.data.frame.

    0 讨论(0)
提交回复
热议问题