一直不是很懂.~是怎么用的,万一别人的代码用上了这个我就很难看懂了……

这些是我主要的困惑:

  1. 什么情况下可以用.~?只能是管道内吗还是和管道没关系?
  2. .相当于一个索引,但是往往指代什么?
  3. ~感觉像是一个省略标记,可以省略什么东西?

示例摘自R for Data Science

library(magrittr)
library(purrr)

mtcars %>%
  split(.$cyl) %>%
  map(function(df) lm(mpg ~ wt, data = df))
#> $`4`
#> 
#> Call:
#> lm(formula = mpg ~ wt, data = df)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>      39.571       -5.647  
#> 
#> 
#> $`6`
#> 
#> Call:
#> lm(formula = mpg ~ wt, data = df)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>       28.41        -2.78  
#> 
#> 
#> $`8`
#> 
#> Call:
#> lm(formula = mpg ~ wt, data = df)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>      23.868       -2.192

mtcars %>%
  split(.$cyl) %>%
  map(~ lm(mpg ~ wt, data = .))
#> $`4`
#> 
#> Call:
#> lm(formula = mpg ~ wt, data = .)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>      39.571       -5.647  
#> 
#> 
#> $`6`
#> 
#> Call:
#> lm(formula = mpg ~ wt, data = .)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>       28.41        -2.78  
#> 
#> 
#> $`8`
#> 
#> Call:
#> lm(formula = mpg ~ wt, data = .)
#> 
#> Coefficients:
#> (Intercept)           wt  
#>      23.868       -2.192

<sup>Created on 2019-04-09 by the reprex package (v0.2.1)</sup>

    Hoas

    其实.在R里的管道(pipe)和公式(formula)里都用到,而~目前我只见到在公式里用过(linux系统里用~表示/home/user强行说也算)
    分开来说的话

    1. .%>%管道里的占位符,一般管道左手边函数(LHS)的计算结果默认是管道右手边(RHS)函数的第一个参数,如果不是第一个参数的话,就可以在RHS函数里使用.表示LHS的结果的参数位置。举例:
      library(dplyr)
      
      ## 1/3
      (1+2) %>%
        '/'(1,.)
      #> [1] 0.3333333
      
      ## 3/1
      (1+2) %>%
        '/'(1)
      #> [1] 3
      1. ~用于创建一个类别为公式(formula)的R对象,如你代码里的线性拟合函数lm的第一个参数就是公式。公式除了在类似的建模函数里常见以外,在绘图包ggplot2的老版本里也用它来分子图,详见help("facet_grid")

      2. .在公式(formula)里也在不同的上下文里有不同的意思。参考下面的第四个链接。不过在你的代码里,.只有管道里的占位符的意思。

      资料

      管道里的.
      https://cran.r-project.org/web/packages/magrittr/vignettes/magrittr.html
      https://stackoverflow.com/questions/42385010/using-the-pipe-and-dot-notation

      公式里的~.
      https://www.rdocumentation.org/packages/stats/versions/3.5.3/topics/formula
      https://stackoverflow.com/questions/13446256/meaning-of-tilde-dot-argument

      tctcab 谢谢!
      虽然有些还没看懂,想通了的先补充下:

      pipe

      1. 默认(函数开头补上.,)+一般情况(LHS是RHS的第一个参数):
        library(magrittr)
        
        1 %>% `/`(2)
        #> [1] 0.5
        
        1 %>% `/`(.,2)
        #> [1] 0.5
        <sup>Created on 2019-04-10 by the reprex package (v0.2.1)</sup>
        1. 如果想封闭一般情况,那么可以用{}包围RHS:
          library(magrittr)
          
          (1+2) %>%
            '/'(1,.)
          #> [1] 0.3333333
          
          (1+2) %>%
          {'/'(1,.)}
          #> [1] 0.3333333
          
          list(a = 1) %>% `/`(.$a, 2)
          #> Error in `/`(., .$a, 2): 运算符需要一个或两个参数
          
          list(a = 1) %>% {`/`(.$a, 2)}
          #> [1] 0.5
          <sup>Created on 2019-04-10 by the reprex package (v0.2.1)</sup>

          第一对例子'/'操作数不因为不加{}而受影响,应该是这对例子里面没有.的 subset 操作吧……

          formula

          .换了个意思,指的是数据中尚未用到的任何列
          library(magrittr)
          
          lm(mpg ~ wt, data= mtcars)
          #> 
          #> Call:
          #> lm(formula = mpg ~ wt, data = mtcars)
          #> 
          #> Coefficients:
          #> (Intercept)           wt  
          #>      37.285       -5.344
          
          # 除了mpg都有
          lm(mpg ~ ., data= mtcars)
          #> 
          #> Call:
          #> lm(formula = mpg ~ ., data = mtcars)
          #> 
          #> Coefficients:
          #> (Intercept)          cyl         disp           hp         drat  
          #>    12.30337     -0.11144      0.01334     -0.02148      0.78711  
          #>          wt         qsec           vs           am         gear  
          #>    -3.71530      0.82104      0.31776      2.52023      0.65541  
          #>        carb  
          #>    -0.19942
          
          # 如果每个列都要用到
          plot(~., data = mtcars)
          <sup>Created on 2019-04-10 by the reprex package (v0.2.1)</sup>

        Hoas 其实点 . 代表什么意思并不是 R 的语法规定的(相比之下,~ 是 R 语法规定的,就是公式),它本质上就是个普通变量名,因为点是合法变量名,你可以给这个变量赋值,如

        . = 1
        .. = 42

        所以包和函数的作者可以玩弄任何黑魔法,让 . 代表他们想代表的意思。管道王国里他们安排点成为占位大使,代表管道之前的一坨对象;基础 R 系统命令点在公式里代表数据框中除了因变量之外的所有剩余变量。如果你愿意,你也可以安排别的变量名成为这样的代表,比如 mpg ~ 隔壁老王隔壁老王也是合法变量名)。

        另外,尽管你的管道代码都只是示例性代码,但我是真心希望实际应用中不要有人这样写代码,实在是拗口得可怕。

          yihui 谢谢指点,我认为管道函数能发挥它基本的直观以及可读性就行了,我只是想了解得多一点点,但是现在发现经常用的就是最基本的

            Hoas 那样就够了呀。其实功能多得永远学不完的包在我看来也是很可怕的包(比如我的一些包)。对管道来说,用它来导流数据就已经发挥了它最重要的功效了。如果用它来写一般的程序,结果会得不偿失:既没有可读性,又绕弯费解。

            也可以用

            ?`.` 
            ?`~`

            来查它们的官方定义。

            3 个月 后

            逐渐意识到反引号`也是R语言中极其重要的一部分。这个内容要是早点学到就好了。

              4 天 后

              Heterogeneity 想请问问反引号除了用来把一些操作符., ~变成一般函数名还有什么重要的用途? 刚刚开始学习R的新手求带

                pauldong 我知道的也是这个。还可以把非标变量名变得合法化。比如tidyr包里spread()函数,把长表格转变为宽表格的时候,由于新的字段名来自于被拆分字段中的值,而值本身可能是不满足变量命名规则的。这个时候宽表格里新增的字段名就会用反引号括起来。

                另外还有一个重要用途……就是在统计之都发帖的时候把代码段用三个反引号括起来……

                yihui 没事,你的主要问题是你不知道反引号(backtick)和单引号之间的区别,代码块应该用反引号。我帮你编辑了。

                😂