Разница между картой, lmap и imap в tidyverse (пакет purr)?

#r #functional-programming #tidyverse #purrr

Вопрос:

Я являюсь пользователем R. Я в основном использую базовые функции apply в R. Однако пакет purrr показался мне интересным, но я не мог различить функции map, lmap и imap. Я был бы признателен, если бы кто-нибудь мог дифференцировать функции с помощью некоторых примеров. Я попробовал ссылку на пакет purrr, но не смог понять реальных различий между ними. Спасибо.

Комментарии:

1. Пожалуйста, исправьте многочисленные ошибки в имени пакета.

2. Спасибо за ваш вклад. Я изменил их.

Ответ №1:

  1. карта: отображает элементы, работая с каждой функцией.
  2. imap: как карта, за исключением того, что вы также получаете индекс или имя элемента.
  3. lmap: сопоставляет элементы, требует, чтобы они были в списке, и выполняет функцию для каждого из них в виде списка из одного элемента

Видеть:

 # map:

> foo <- map( c(6:8), ~ print( .x ) )
[1] 6
[1] 7
[1] 8

# imap:
> foo <- imap( c(6:8), ~ print( c(.x,.y) ) )
[1] 6 1
[1] 7 2
[1] 8 3

# lmap:
> foo <- lmap( c(6:8), ~ print( c(.x) ) ) ## ERROR!
> foo <- > foo <- lmap( as.list(6:8), ~ print(.x) )
[[1]]
[1] 6

[[1]]
[1] 7

[[1]]
[1] 8

## imap with names instead:
> foo <- imap( myvector, ~ cat( paste(.x,.y), "n" ) )
6 a 
7 b 
8 c 

 

Примечание lmap также работает с данными.фреймами (которые по сути являются списками). Это может быть очень полезно, учтите следующее:

 ## map:

> foo <- map( head(iris,n=3), print )
[1] 5.1 4.9 4.7
[1] 3.5 3.0 3.2
[1] 1.4 1.4 1.3
[1] 0.2 0.2 0.2
## -> each iteration gets a vector

## and with lmap:
> foo <- lmap( head(iris,n=3), print )
  Sepal.Length
1          5.1
2          4.9
3          4.7
  Sepal.Width
1         3.5
2         3.0
3         3.2
  Petal.Length
1          1.4
2          1.4
3          1.3
  Petal.Width
1         0.2
2         0.2
3         0.2
  Species
1  setosa
2  setosa
3  setosa
## -> each iteration gets a 1-column data.frame (which is useful when you need that)
 

Комментарии:

1. Спасибо за ответ. Я действительно ценю это.

2. Я не думаю, что понимаю, почему вы используете lmap. это для того, чтобы убедиться , что входные данные представляют собой список, точно так же, как map_chr (), убедитесь, что выходные данные, например, вектор символов?

3. нет, это должно иметь индекс каждого элемента, а также фактического элемента. иногда вам нужно знать, какой номер товара вы обрабатываете, а также сам товар