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 (reference not available anymore). Also thanks to Tommy at StackOverflow for suggesting how to handle double and triple colon operators, ::, further enhancing the function.

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.

Author

Max Gordon <max@gforge.se>

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.

Examples

DoCall("complex", list(imaginary = 1:3))
#> [1] 0+1i 0+2i 0+3i

## 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 = ""))
#>  [1] "a1+" "b1+" "a2+" "b2+" "a3+" "b3+" "a1-" "b1-" "a2-" "b2-" "a3-" "b3-"

## 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
#> [1] 2
DoCall("f", list(A))                         # 2
#> [1] 2
DoCall("f", list(A), envir = env)            # 4
#> [1] 4
DoCall(f, list(A), envir = env)              # 2
#> [1] 2
DoCall("f", list(quote(A)), envir = env)     # 100
#> [1] 100
DoCall(f, list(quote(A)), envir = env)       # 10
#> [1] 10
DoCall("f", list(as.name("A")), envir = env) # 100
#> [1] 100

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