将省略号参数传递给map函数purrr包,R

时间:2018-01-11 20:29:34

标签: r ellipsis purrr

我想在purrr包的map函数中使用省略号参数。这是一个玩具的例子:

f1<-function(x,a=NA,b=NA,prs=seq(0, 1, 0.25),SW=T){
  if(SW){
    res<-data.frame(name1=a,name2=b,t(quantile(x, prs, na.rm = T)),  mean=mean(x, na.rm = T), sd=sd(x, na.rm = T),
                    NAs=length(x[is.na(x)]),n=length(x[!is.na(x)]),SWp=shapiro.test(x)$p.value,stringsAsFactors =F)
  }else
  {
    res<-data.frame(name1=a,name2=b,t(quantile(x, prs, na.rm = T)),  mean=mean(x, na.rm = T), sd=sd(x, na.rm = T),
                    NAs=length(x[is.na(x)]),n=length(x[!is.na(x)]),stringsAsFactors =F)
  }
return(res)
}

f1(c(NA,rnorm(25),NA),SW=F)
f1(c(NA,rnorm(25),NA))

现在我想在另一个函数f2中使用f1:

f2<-function(df,...){
  res<-map_df(colnames(df),~f1(df[,.],a=.,...))
  return(res)
}

其中......主要用于操纵f1函数中的SW和a或b参数。但是f2没有做我想要的,这里可以看到

f2(iris[,-5])
f2(iris[,-5],SW=F)

我感谢任何指导如何使用addecuatelly ...在地图内

4 个答案:

答案 0 :(得分:4)

您只需要通过map_df()调用传递省略号。否则他们无法进入内部f1()电话。

f2 <- function(df, ...){
  res <- map_df(colnames(df), ~f1(df[,.], a=., ...), ...)
  return(res)
}

答案 1 :(得分:0)

您还可以在第二个功能中尽早捕获椭圆,并在以后使用type mismatch将其添加到第一个功能中。这样可以更清楚地在何处以及如何使用它们。

do.call

答案 2 :(得分:0)

MrFlick解决方案对我不起作用:我认为确实您还需要将//throttle for 5 secs if it's already been called with this KEY Debouncer.Debounce("Some-Unique-ID", () => SendEmails(), 5); 传递给匿名函数,该函数随后需要使用Debouncer.Debounce("Some-Unique-ID", () => { //do some work here }, 5); 而不是...(如@ dmi3kno)。

这意味着您需要非常令人惊讶的三次function(x,...)通话:

~

示例:

...

reprex package(v0.3.0)于2020-11-16创建

答案 3 :(得分:0)

对于这个问题,我发现 rlang::exec() 允许您在与匿名函数结合使用时将 ... 传递给 purrr::map(),如下所示:

f2 <- function(df, ...){
  res <- map(colnames(df), function(x) rlang::exec("f1", df[,x], ...))
  return(res)
}