Function parameter as argument in an R function

12,828

Solution 1

In R, a function can be provided as a function argument. The syntax matches the one of non-function objects.

Here is an example function.

myfun <- function(x, FUN) {
  FUN(x)
}

This function applies the function FUN to the object x.

A few examples with a vector including the numbers from 1 to 10:

vec <- 1:10 

> myfun(vec, mean)
[1] 5.5
> myfun(vec, sum)
[1] 55
> myfun(vec, diff)
[1] 1 1 1 1 1 1 1 1 1

This is not limited to built-in functions, but works with any function:

> myfun(vec, function(obj) sum(obj) / length(obj))
[1] 5.5

mymean <- function(obj){
  sum(obj) / length(obj)
}
> myfun(vec, mymean)
[1] 5.5

Solution 2

you can also store a function name as a character variable, and call it with do.call()

> test = c(1:5)
> do.call(mean, list(test))
[1] 3
> 
> func = 'mean'
> do.call(func, list(test))
[1] 3
Share:
12,828
jatotterdell
Author by

jatotterdell

Updated on July 18, 2022

Comments

  • jatotterdell
    jatotterdell over 1 year

    I am attempting to write a general function to calculate coverage probabilities for interval estimation of Binomial proportions in R. I intend to do this for a variety of confidence interval methods e.g. Wald, Clopper-Pearson, HPD intervals for varying priors.

    Ideally, I would like there to be one function, that can take, as an argument, the method that should be used to calculate the interval. My question then: how can I include a function as an argument in another function?

    As an example, for the Exact Clopper-Pearson interval I have the following function:

    # Coverage for Exact interval
    ExactCoverage <- function(n) {
    p <- seq(0,1,.001)
    x <- 0:n
    
    # value of dist
    dist <- sapply(p, dbinom, size=n, x=x)
    
    # interval
    int <- Exact(x,n)
    
    # indicator function
    ind <- sapply(p, function(x) cbind(int[,1] <= x & int[,2] >= x))
    
    list(coverage = apply(ind*dist, 2, sum), p = p)
    }
    

    Where Exact(x,n) is just a function to calculate the appropriate interval. I would like to have

    Coverage <- function(n, FUN, ...)
    ...
    # interval
    int <- FUN(...)
    

    so that I have one function to calculate the coverage probabilities rather than a separate coverage function for each method of interval calculation. Is there a standard way to do this? I have not been able to find an explanation.

    Thanks, James

  • Christian
    Christian over 7 years
    How would you add function parameters for the passed function "FUN"?
  • Alfredo G Marquez
    Alfredo G Marquez about 3 years
    This is really late @Christian, but for others: ``` myfun <- function(x, FUN, ...) { FUN(x, ...) } ```