r-是否让"purrr::pmap()"忽略多余的列



我正试图使用purrr::pmap()按名称将函数映射到数据帧的列上。

但是,我注意到,对于pmap,数据帧必须包含与函数中的名称匹配的列,并且不能包含其他列。例如,下面的第一个pmap()调用失败,但第二个调用有效,我过滤到所需的列。

有没有办法让pmap()忽略额外的列?或者有更好的方法来做这种事情吗?

library(tidyverse)
# Test data
set.seed(123) # for reproducibility
df <- tibble(a = runif(5),
b = runif(5),
c = runif(5),
d = runif(5))
f <- function(a, b, d) a+b+d
# Doesn't work
pmap(df, f)
Error in .f(a = .l[[1L]][[i]], b = .l[[2L]][[i]], c = .l[[3L]][[i]], d = .l[[4L]][[i]],  : 
unused argument (c = .l[[3]][[i]])
# This works
pmap(df[c("a", "b", "d")], f)

我们可以根据函数中的参数值select

library(dplyr)
library(purrr)
pmap(df %>% 
select(any_of(names(as.list(args(f))))), f)
[[1]]
[1] 1.232959
[[2]]
[1] 1.562498
[[3]]
[1] 1.343455
[[4]]
[1] 1.762373
[[5]]
[1] 2.351586

你可以做:

library(tidyverse)
# Test data
df <- tibble(a = runif(5),
b = runif(5),
c = runif(5),
d = runif(5))
f <- function(...) {
l <- list(...)
with(l, a+b+d) 
}
pmap(df, f)

或者:

f <- function(...) {
list2env(list(...), environment())
a+b+d 
}

最新更新