# File src/library/base/R/mapply.R # Part of the R package, http://www.R-project.org # # Copyright (C) 1995-2012 The R Core Team # # This program is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by # the Free Software Foundation; either version 2 of the License, or # (at your option) any later version. # # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the # GNU General Public License for more details. # # A copy of the GNU General Public License is available at # http://www.r-project.org/Licenses/ mapply <- function(FUN,..., MoreArgs = NULL, SIMPLIFY = TRUE, USE.NAMES = TRUE) { FUN <- match.fun(FUN) dots <- list(...) answer <- .Internal(mapply(FUN, dots, MoreArgs)) if (USE.NAMES && length(dots)) { if (is.null(names1 <- names(dots[[1L]])) && is.character(dots[[1L]])) names(answer) <- dots[[1L]] else if (!is.null(names1)) names(answer) <- names1 } if(!identical(SIMPLIFY, FALSE) && length(answer)) simplify2array(answer, higher = (SIMPLIFY == "array")) else answer } .mapply <- function(FUN, dots, MoreArgs) .Internal(mapply(FUN, dots, MoreArgs)) Vectorize <- function(FUN, vectorize.args = arg.names, SIMPLIFY = TRUE, USE.NAMES = TRUE) { arg.names <- as.list(formals(FUN)) arg.names[["..."]] <- NULL arg.names <- names(arg.names) vectorize.args <- as.character(vectorize.args) if (!length(vectorize.args)) return(FUN) if (!all(vectorize.args %in% arg.names)) stop("must specify names of formal arguments for 'vectorize'") FUNV <- function() { ## will set the formals below args <- lapply(as.list(match.call())[-1L], eval, parent.frame()) names <- if(is.null(names(args))) character(length(args)) else names(args) dovec <- names %in% vectorize.args do.call("mapply", c(FUN = FUN, args[dovec], MoreArgs = list(args[!dovec]), SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES)) } formals(FUNV) <- formals(FUN) FUNV }