我正试图使用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
}