Pass arguments into function within a function

25,054

Try three dots instead of four, and add the ellipsis argument to the top level function:

myfunction <- function (dataframe, Colv = NA, ...) { 
    matrix <- as.matrix (dataframe) 
    out <- heatmap(matrix, Colv = Colv, ...)
    return(out)
}
Share:
25,054
jon
Author by

jon

Updated on July 22, 2022

Comments

  • jon
    jon almost 2 years

    I am writing function that involve other function from base R with a lot of arguments. For example (real function is much longer):

    myfunction <- function (dataframe, Colv = NA) { 
    matrix <- as.matrix (dataframe) 
    out <- heatmap(matrix, Colv = Colv)
    return(out)
    }
    
    data(mtcars)
    
    myfunction (mtcars, Colv = NA)
    

    The heatmap has many arguments that can be passed to:

    heatmap(x, Rowv=NULL, Colv=if(symm)"Rowv" else NULL,
            distfun = dist, hclustfun = hclust,
            reorderfun = function(d,w) reorder(d,w),
            add.expr, symm = FALSE, revC = identical(Colv, "Rowv"),
            scale=c("row", "column", "none"), na.rm = TRUE,
            margins = c(5, 5), ColSideColors, RowSideColors,
            cexRow = 0.2 + 1/log10(nr), cexCol = 0.2 + 1/log10(nc),
            labRow = NULL, labCol = NULL, main = NULL,
            xlab = NULL, ylab = NULL,
            keep.dendro = FALSE, verbose = getOption("verbose"), ...)
    

    I want to use these arguments without listing them inside myfunction.

    myfunction (mtcars, Colv = NA, col = topo.colors(16))
    Error in myfunction(mtcars, Colv = NA, col = topo.colors(16)) : 
      unused argument(s) (col = topo.colors(16))
    

    I tried the following but do not work:

    myfunction <- function (dataframe, Colv = NA) { 
    matrix <- as.matrix (dataframe) 
    out <- heatmap(matrix, Colv = Colv, ....)
    return(out)
    }
    data(mtcars)
    
    myfunction (mtcars, Colv = NA, col = topo.colors(16))
    
  • Carl Witthoft
    Carl Witthoft about 12 years
    Just to add an option (or add confusion), you can augment the contents of ... by setting a variable inside your main function dotfuns<-list(..., other_variable) and passing that to subsequent functions. Do this at your own risk :-)
  • jon
    jon about 12 years
    @CarlWitthoft sorry I could not get what you mean, could exand your solution (perhaps as answer )
  • Carl Witthoft
    Carl Witthoft about 12 years
    It wasn't an answer to your specific problem, just a comment on other things that can be done with the ... collection of arguments.
  • Dimitrios Zacharatos
    Dimitrios Zacharatos over 4 years
    this answer is very helpful, I wonder if there is a solution when you have 2 different functions with different names of arguments
  • Alf Pascu
    Alf Pascu about 2 years
    @DimitriosZacharatos when you have 2 or more different functions within your function you can specify lists of arguments, have a look at G. Grothendieck answer to this question.