R: Fast Alternative To The Internal 'do.call'

DoCall {DescTools} | R Documentation

## Fast Alternative To The Internal `do.call`

### Description

The `do.call` can be somewhat slow, especially when working with large objects. This function is based upon the suggestions from Hadley Wickham on the R mailing list, see here. Also thanks to Tommy at StackOverflow for suggesting how to handle double and triple colon operators, `::`, further enhancing the function.

### Usage

    DoCall(what, args, quote = FALSE, envir = parent.frame())

### Arguments

`what` | either a function or a non-empty character string naming the function to be called.
`args` | a list of arguments to the function call. The `names` attribute of `args` gives the argument names.
`quote` | a logical value indicating whether to quote the arguments.
`envir` | an environment within which to evaluate the call. This will be most useful if `what` is a character string and the arguments are symbols or quoted expressions.

### Note

While the function attempts to do most of what `do.call` can it has limitations. It can currently not parse the example code from the original function:
`do.call(paste, list(as.name("A"), as.name("B")), quote = TRUE)` and the funcitonality of `quote` has not been thoroughly tested.

### Note

This is a verbatim copy from `Gmisc::fastDoCall.`

### Author(s)

Max Gordon <max@gforge.se>

### Examples

    DoCall("complex", list(imaginary = 1:3))

    ## if we already have a list (e.g. a data frame)
    ## we need c() to add further arguments
    tmp <- expand.grid(letters[1:2], 1:3, c("+", "-"))
    DoCall("paste", c(tmp, sep = ""))

    ## examples of where objects will be found.
    A <- 2
    f <- function(x) print(x^2)
    env <- new.env()
    assign("A", 10, envir = env)
    assign("f", f, envir = env)
    f <- function(x) print(x)
    f(A)                                         # 2
    DoCall("f", list(A))                         # 2
    DoCall("f", list(A), envir = env)            # 4
    DoCall(f, list(A), envir = env)              # 2
    DoCall("f", list(quote(A)), envir = env)     # 100
    DoCall(f, list(quote(A)), envir = env)       # 10
    DoCall("f", list(as.name("A")), envir = env) # 100

    eval(call("f", A))                           # 2
    eval(call("f", quote(A)))                    # 2
    eval(call("f", A), envir = env)              # 4
    eval(call("f", quote(A)), envir = env)       # 100

[Package DescTools version 0.99.28 Index]