当先前的chan不是

时间:2018-05-08 15:08:02

标签: r tidyverse purrr

我想了解有关 purrr 包的更多信息。我可以看到一致性的一些优势,但我正在努力解决任意问题的灵活性。我一直很喜欢Map的灵活性和相对易用性。我已经阅读了pmap,但是对于你想要将一个对象传递给下一个部分并且n个列表循环遍及该对象的情况而言,使用Map似乎更尴尬。

以下是一个最小的例子。代码将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 :(得分:4)

您可以使用invoke_map来调用带有参数列表的函数列表,以及列表中所有函数共享的参数。

棘手的部分是正确嵌套路径列表,因为它需要是列表列表。您可以在一行中执行此操作,而不是先保存funspaths;为了清楚起见,我这样做了。

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”。