purrr :: map中first tilde的含义是什么?

CPa*_*Pak 13 r tilde purrr

我正在看这个使用的例子map.这里是:

mtcars %>%
  split(.$cyl) %>% # from base R
  map(~ lm(mpg ~ wt, data = .))
Run Code Online (Sandbox Code Playgroud)

第一个波浪号的含义是什么map(~ lm...?也就是说,R如何解释第一个波浪号?(据我所知,第二个代字号表示功能......).另一种询问方式是,为什么以下不起作用?

mtcars %>%
  split(.$cyl) %>% # from base R
  map(lm(mpg ~ wt, data = .))
Run Code Online (Sandbox Code Playgroud)

MrF*_*ick 21

根据地图帮助文档,map需要一个函数,但它也接受公式,字符向量,数字向量或列表,后者转换为函数.

~R中的运算符创建公式.~ lm(mpg ~ wt, data = .)公式也是如此.公式在R中很有用,因为它们阻止了符号的立即评估.例如,您可以定义

x <- ~f(a+b)
Run Code Online (Sandbox Code Playgroud)

没有f,ab在任何地方定义.在这种情况下~ lm(mpg ~ wt, data = .)基本上是一个快捷方式,function(x) {lm(mpg ~ wt, data = x)}因为map可以.根据需要更改公式中的值.

没有代字号,lm(mpg ~ wt, data = .)只是R中的表达式或调用,立即进行评估.该.不会在这就是所谓的时间来定义map无法转换成一个函数.

您可以将这些公式转换为map()with purrr::as_mapper()函数之外的函数.例如

myfun <- as_mapper(~lm(mpg ~ wt, data = .))
myfun(mtcars)
# Call:
# lm(formula = mpg ~ wt, data = .)
# 
# Coefficients:
# (Intercept)           wt  
#      37.285       -5.344  

myfun
# <lambda>
# function (..., .x = ..1, .y = ..2, . = ..1) 
# lm(mpg ~ wt, data = .)
# attr(,"class")
# [1] "rlang_lambda_function"
Run Code Online (Sandbox Code Playgroud)

您可以看到它是如何.成为传递给该函数的第一个参数.