purrr альтернатива Map, когда предыдущий канал не является тем, что зацикливается - PullRequest
0 голосов
/ 08 мая 2018

Я хочу узнать больше о пакете purrr . Я вижу некоторые нюансы в непротиворечивости, но я борюсь с гибкостью для произвольных проблем. Мне всегда нравились гибкость и относительная простота использования Map. Я читал о pmap, но работать с Map кажется более неловким для ситуации, когда вы хотите передать объект в следующую часть и иметь n списков зацикливания этого объекта совместно друг с другом.

Ниже приведен минимальный пример. Код передает mtcars в цикл (в данном случае Map), который, в свою очередь, перебирает функции записи и расширения файлов и использует mtcars из предыдущей цепочки для записи файла. Как я мог написать этот код, используя подход purrr / tidyverse?

Я ценю, что могу просто передать c('fst', 'csv') и построить функции расширения и записи из одного вектора, используя match.call. Этот MWE предназначен для демонстрации необходимости передавать 2 или более списков / векторов по объекту, передаваемому по цепочке (этот объект в некотором смысле статичен).

library(tidyverse)
library(fst)

mtcars %>%
    {Map(function(fun, ext) {
            fun(., sprintf('mtcars.%s', ext))
        }, 
        list(fst::write_fst, readr::write_csv), 
        list('fst', 'csv')
    )} %>%
    invisible()

1 Ответ

0 голосов
/ 08 мая 2018

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

Сложная часть заключалась в правильном вложении списка путей, поскольку это должен быть список списков. Вы можете сделать все это в одной строке, вместо того, чтобы сначала сохранять funs и paths; Я сделал это просто для ясности.

library(tidyverse)

funs <- list(fst::write_fst, readr::write_csv)
paths <- map(list("fst", "csv"), ~list(path = sprintf("mtcars.%s", .)))

invoke_map(funs, paths, x = mtcars)

При сопоставлении двух функций обе они выводят mtcars на консоль. Не идеально, но, насколько я могу судить, не существует invoke версии функций walk, которые используют побочные эффекты, а не возвращают фрейм данных. Это сохраняет файлы "mtcars.fst" и "mtcars.csv".

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...