Обновление purrr до версии 1.0



purrr - пакет в R из core tidyverse для замены циклов и функций семейства *apply(). Немного подробнее я писала здесь и скидывала туториал.



Вчера вышло видео Хэдли Викхама про обновление до 1.0 с объяснениями, что изменилось. Однако мне было удобнее прочитать документацию, и оказалось, что обновление вышло в конце прошлого года. Я обновила purrr до версии 1.0.1 и протестировала основные моменты, что изменилось. Давайте разберем.



- Функции для конвертации списков в датафрейм map_dfr()/map_dfc() и их аналоги map2_(), pmap() стали deprecated, то есть разработчики перестали поддерживать эти функции. Объясняется это тем, что они не являются настоящими map-функциями, поскольку в них не сохраняется один к одному соответствие инпута и аутпута. Вместо этого рекомендуется использовать сначала просто map(), а затем эксплицитно прописывать функцию list_rbind()/list_cbind() для соединения датафрейма по строкам/столбцам как в map_dfr()/map_dfc(), соответственно. Вот пример из документации:



paths |> map_dfr(read_csv, .id = "path")

# now

paths |>

map(read_csv) |>

list_rbind(names_to = "path")



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



- Добавили progress bar для отслеживания времени выполнения функций. Реализуется это подачей аргумента .progress = TRUE в любую map функцию. Однако, если задача выполняется быстро, то прогресс бар не будет появляться (я проверила). Также можно прописать, что именно выполняется, подав строку в .progress, например

map(1:100, \(x) Sys.sleep(0.1), .progress = 'Saving plot')

Это мне очень понравилось, думаю, что буду использовать для долгих маппингов. Всегда приятно знать, что функция не упала, а выполняется и примерно понимать сколько осталось.



- Добавили функцию map_vec() для работы с любым типом векторов. map_vec() является расширением map_lgl(), map_int(), map_dbl() и map_chr() для произвольных типов векторов - например для факторов, даты и времени.



- Уходят от синтаксиса формулы для анонимных функций (~ .x + 1) к другому синтаксису: \(x) x + 1, и от магриттаровского пайпа %>% уходят к нативному |> (хотя это уже давно). Последнее аргументируется тем, что нативный пайп будет работать без подключения дополнительных пакетов, это важно например при разработке своих пакетов, чтобы не получать лишние зависимости. Синтаксис новых анонимных функций я вообще в первый раз вижу, но могу согласиться, что он выглядит более понятно, чем синтаксис формулы. Хотя я только привыкла к формуле, как снова надо переучиваться. Впрочем, старое доброе function(x) x + 1 в качестве анонимных функций тоже никто не отменял, и на мой взгляд это самый понятный синтаксис.



Пример работы нового синтаксиса анонимных функций:

# Previously we wrote

1:10 %>%

map(~ rnorm(10, .x)) %>%

map_dbl(mean)

#> [1] 0.5586355 1.8213041 2.8764412 4.1521664 5.1160393 6.1271905

#> [7] 6.9109806 8.2808301 9.2373940 10.6269104



# Now we recommend

1:10 |>

map(\(mu) rnorm(10, mu)) |>

map_dbl(mean)

#> [1] 0.4638639 2.0966712 3.4441928 3.7806185 5.3373228 6.1854820

#> [7] 6.5873300 8.3116138 9.4824697 10.4590034



Я разобрала наиболее интересные для меня изменения, это не все, поэтому рекомендую далее прочитать документацию самостоятельно.



#R #tidyverse #purrr