purrr::map中第一个波浪线的含义是什么?

23

我正在查看使用map示例。这是它:

mtcars %>%
  split(.$cyl) %>% # from base R
  map(~ lm(mpg ~ wt, data = .))
< p >在map(~ lm...中,第一个波浪号(~)的含义是什么?也就是说,R如何解释第一个波浪号?(我知道第二个波浪号表示函数...)。换句话说,为什么下面的代码不起作用?

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

1
你有阅读过 ~ 的帮助文档吗?尝试使用 help("~") - Spacedman
它描述了~通常用于什么,即表示公式。那么map只接受公式吗? - CPak
1个回答

37
根据 地图帮助文档map需要一个函数,但它也接受公式、字符向量、数字向量或列表,最后一种类型会被转换为函数。
在 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"
你可以看到如何将.作为第一个参数传递给该函数。

很明白为什么 lm(mpg ~ wt,... 不能工作。谢谢! - CPak

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接