我想了解有关 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()
答案 0 :(得分:4)
您可以使用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”。