purrr::map 中的第一个波浪号是啥意思

Posted

技术标签:

【中文标题】purrr::map 中的第一个波浪号是啥意思【英文标题】:What is meaning of first tilde in purrr::mappurrr::map 中的第一个波浪号是什么意思 【发布时间】:2017-12-03 16:54:42 【问题描述】:

我正在查看使用map 的example。这里是:

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

【问题讨论】:

你阅读了~的帮助吗?试试help("~") 它描述了~ 通常用于什么。即表示一个公式。那么map 是否只接受公式? 【参考方案1】:

根据map help documentation,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,... 不起作用是有道理的。谢谢!

以上是关于purrr::map 中的第一个波浪号是啥意思的主要内容,如果未能解决你的问题,请参考以下文章

帮看下这句css中的波浪号是啥意思

宏中的波浪号 (~) 是啥意思?

安卓手机的版本号是啥意思

IBM小机中的WWN号是啥意思

CSS中的符号波浪号(〜)是啥意思[重复]

我的 composer.json 文件中的波浪号 (~) 是啥意思?