Что означает первая тильда в мурлыканье :: карта

Я просматривал этот пример, в котором используется map. Вот:

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

person CPak    schedule 29.06.2017    source источник
comment
Вы читали справку по ~? Попробуйте help("~").   -  person Spacedman    schedule 29.06.2017
comment
Он описывает, для чего обычно используется ~. То есть указать формулу. Тогда map принимает только формулы?   -  person CPak    schedule 29.06.2017


Ответы (1)


Согласно справочной документации по карте, 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 не может преобразовать его в функцию.

Вы можете превратить эти формулы в функции за пределами 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"

Вы можете видеть, как . становится первым параметром, передаваемым этой функции.

person MrFlick    schedule 29.06.2017
comment
Имеет смысл, почему lm(mpg ~ wt,... не работает. Спасибо! - person CPak; 29.06.2017