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

时间:2017-06-29 20:29:39

标签: r purrr tilde

我正在查看使用map的{​​{3}}。这是:

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

1 个答案:

答案 0 :(得分:14)

根据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无法将其转换为函数。

您可以使用map()函数将这些公式转换为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"

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