purrr::map 中的第一个代字号是什么意思
What is meaning of first tilde in purrr::map
我正在查看使用 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 = .))
根据 map help documentation,map
需要一个函数,但它也接受公式、字符向量、数字向量或列表,后者被转换为函数。
R 中的 ~
运算符创建公式。所以 ~ lm(mpg ~ wt, data = .)
是一个公式。公式在 R 中很有用,因为它们可以防止立即对符号求值。例如你可以定义
x <- ~f(a+b)
没有在任何地方定义 f
、a
或 b
。在这种情况下 ~ 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"
您可以看到 .
如何成为传递给该函数的第一个参数。
我正在查看使用 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 = .))
根据 map help documentation,map
需要一个函数,但它也接受公式、字符向量、数字向量或列表,后者被转换为函数。
R 中的 ~
运算符创建公式。所以 ~ lm(mpg ~ wt, data = .)
是一个公式。公式在 R 中很有用,因为它们可以防止立即对符号求值。例如你可以定义
x <- ~f(a+b)
没有在任何地方定义 f
、a
或 b
。在这种情况下 ~ 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"
您可以看到 .
如何成为传递给该函数的第一个参数。