Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

passing ellipsis arguments to map function purrr package, R

Tags:

r

ellipsis

purrr

I want to use ellipsis parameters inside map function of purrr package. this is a toy example:

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))

now I want to use f1 inside another function f2:

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

where ... is intended mainly to manipulate SW and a or b parameters in f1 function. however f2 is not doing what I want as can be seen here

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

I appreciate any guide in how to use addecuatelly ... inside map

like image 938
Nicolas Molano Avatar asked Jan 28 '23 21:01

Nicolas Molano


2 Answers

You just need to pass the ellipses through the map_df() call as well. Otherwise they can't get into the inner f1() call.

f2 <- function(df, ...){
  res <- map_df(colnames(df), ~f1(df[,.], a=., ...), ...)
  return(res)
}
like image 101
MrFlick Avatar answered Jan 31 '23 12:01

MrFlick


You can also capture the ellipses early on in your second function, and use do.call to add them to your first function later on. This makes it more explicit where and how they are used.

f2 <- function(df, ...){
  params <- list(...)
  res <- map_df(colnames(df), ~ do.call(
    f1, c(list(x = df[,.], a=.), params)))
  return(res)
}
like image 30
JWilliman Avatar answered Jan 31 '23 10:01

JWilliman