purrr::map 中的第一个代字号是什么意思

What is meaning of first tilde in purrr::map

我正在查看使用 mapexample。这是:

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

map(~ lm...中的第一个波浪号是什么意思?也就是说,R 如何解释第一个代字号? (我知道第二个波浪号表示函数...)。另一种提问方式是,为什么下面的方法不起作用?

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

根据 map help documentationmap 需要一个函数,但它也接受公式、字符向量、数字向量或列表,后者被转换为函数。

R 中的 ~ 运算符创建公式。所以 ~ lm(mpg ~ wt, data = .) 是一个公式。公式在 R 中很有用,因为它们可以防止立即对符号求值。例如你可以定义

x <- ~f(a+b)

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

没有波浪号,lm(mpg ~ wt, data = .) 只是 R 中立即计算的表达式或调用。 . 不会在调用时定义,map 无法将其转换为函数。

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

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"

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