这可能是Purr的工作,或者我只需要在这里更改我的功能或数据的布局。
我有一个函数,它接受2个参数,我试图在数据框列表中应用。其中一个参数应该是列表元素(名称)名称,而另一个参数应该是列表组件(列表中的值)。
TruckDto
my_list <- list(Book1 = c("ABC", "DEF", "GHI"), Book2 = c("ABB", "BCC"), Book3 = c("AAA", "BBB", "CCC", "DDD"))
我可以通过在地图中指定参数
轻松地在单个项目上调用它my_function <- function(Book, Chapter) {
path <- paste("www.fake-website.com", "ctp:", Book, "/", Chapter, sep = "")
##Would have API call here, but let's just print path
path
}
输出:
map(my_list$Book1, function(Chapter) my_function(Chapter =
Chapter, Book = "Book1"))
但是如何将函数应用于每个列表元素,将函数调用到每个Book名称和章节值?
我希望像
这样的东西[[1]]
[1] "www.fake-website.comctp:Book1/ABC"
[[2]]
[1] "www.fake-website.comctp:Book1/DEF"
[[3]]
[1] "www.fake-website.comctp:Book1/GHI"
我的功能实际上不仅仅是粘贴书籍和章节,而是从API中获取大量信息并对其进行解析。
但是,我需要帮助的是在数据框列表中进行映射并将书籍arg与章节arg配对。
答案 0 :(得分:2)
您可以使用purrr::imap
,它将列表的名称作为第二个参数传递给函数:
library(purrr)
imap(my_list, ~ my_function(..2, ..1))
# or imap(my_list, ~ my_function(.y, .x))
$Book1
[1] "www.fake-website.comctp:Book1/ABC" "www.fake-website.comctp:Book1/DEF"
[3] "www.fake-website.comctp:Book1/GHI"
$Book2
[1] "www.fake-website.comctp:Book2/ABB" "www.fake-website.comctp:Book2/BCC"
$Book3
[1] "www.fake-website.comctp:Book3/AAA" "www.fake-website.comctp:Book3/BBB"
[3] "www.fake-website.comctp:Book3/CCC" "www.fake-website.comctp:Book3/DDD"
如果您切换函数的参数Book
和Chapter
,则可以执行以下操作:
my_function <- function(Chapter, Book) {
path <- paste("www.fake-website.com", "ctp:", Book, "/", Chapter, sep = "")
path
}
imap(my_list, my_function)
$Book1
[1] "www.fake-website.comctp:Book1/ABC" "www.fake-website.comctp:Book1/DEF"
[3] "www.fake-website.comctp:Book1/GHI"
$Book2
[1] "www.fake-website.comctp:Book2/ABB" "www.fake-website.comctp:Book2/BCC"
$Book3
[1] "www.fake-website.comctp:Book3/AAA" "www.fake-website.comctp:Book3/BBB"
[3] "www.fake-website.comctp:Book3/CCC" "www.fake-website.comctp:Book3/DDD"