Co oznacza pierwsza tylda w purrr:: Mapa

Patrzyłem na ten przykład , który używa map. Tutaj jest:

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

Jakie jest znaczenie pierwszej tyldy w map(~ lm...? Czyli jak R interpretuje pierwszą tyldę? (rozumiem, że druga tylda oznacza funkcję...). Innym sposobem pytania jest, dlaczego poniższe nie działa?

mtcars %>%
  split(.$cyl) %>% # from base R
  map(lm(mpg ~ wt, data = .))
Author: iehrlich, 2017-06-29

1 answers

Zgodnie z dokumentacją pomocy mapy , map wymaga funkcji, ale akceptuje również formułę, wektor znaków, wektor liczbowy lub listę, z których te ostatnie są konwertowane do funkcji.

Operator ~ W R tworzy wzór. Więc ~ lm(mpg ~ wt, data = .) jest wzorem. Wzory są przydatne w R, ponieważ uniemożliwiają natychmiastową ocenę symboli. Na przykład można zdefiniować

x <- ~f(a+b)

BEZ f, a lub b być definiowane gdziekolwiek. W tym przypadku {[4] } jest w zasadzie skrót dla function(x) {lm(mpg ~ wt, data = x)} Ponieważ {[2] } może zmienić wartość . we wzorze w razie potrzeby.

Bez tyldy, lm(mpg ~ wt, data = .) jest tylko wyrażeniem lub wywołaniem w R, które jest natychmiast oceniane. . nie byłoby zdefiniowane w czasie, który jest wywoływany i map nie można przekształcić tego w funkcję.

Możesz przekształcić te formuły w funkcje poza map() za pomocą funkcji purrr::as_mapper(). Na przykład

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"

Możesz zobaczyć, jak . staje się pierwszym parametrem, który został przekazany do tej funkcji.

 29
Author: MrFlick,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-11-13 22:07:18