mapply                 package:base                 R Documentation

Apply a function to multiple list or vector arguments

Description:

     'mapply' is a multivariate version of 'sapply'. 'mapply' applies
     'FUN' to the first elements of each ... argument, the second
     elements, the third elements, and so on. Arguments are recycled if
     necessary.

     'Vectorize' returns a new function that acts as if 'mapply' was
     called.

Usage:

     mapply(FUN, ..., MoreArgs = NULL, SIMPLIFY = TRUE,
            USE.NAMES = TRUE)

     Vectorize(FUN, vectorize.args = arg.names, SIMPLIFY = TRUE,
               USE.NAMES = TRUE)

Arguments:

     FUN: function to apply, found via 'match.fun'.

     ...: arguments to vectorize over (list or vector).

MoreArgs: a list of other arguments to 'FUN'.

SIMPLIFY: logical; attempt to reduce the result to a vector or matrix?

USE.NAMES: logical; use names if the first ... argument has names, or
          if it is a character vector, use that character vector as the
          names.

vectorize.args: a character vector of arguments which should be
          vectorized.  Defaults to all arguments to 'FUN'.

Details:

     The arguments named in the 'vectorize.args' argument to
     'Vectorize' correspond to the arguments passed in the '...' list
     to 'mapply'.  However, only those that are actually passed will be
     vectorized; default values will not.  See the example below.

     'Vectorize' cannot be used with primitive functions as they have
     no formal list.

Value:

     'mapply' returns a list, vector, or matrix.

     'Vectorize' returns a function with the same arguments as 'FUN',
     but wrapping a call to 'mapply'.

See Also:

     'sapply', 'outer'

Examples:

     require(graphics)

     mapply(rep, 1:4, 4:1)

     mapply(rep, times=1:4, x=4:1)

     mapply(rep, times=1:4, MoreArgs=list(x=42))

     # Repeat the same using Vectorize: use rep.int as rep is primitive
     vrep <- Vectorize(rep.int)
     vrep(1:4, 4:1)
     vrep(times=1:4, x=4:1)

     vrep <- Vectorize(rep.int, "times")
     vrep(times=1:4, x=42)

     mapply(function(x,y) seq_len(x) + y,
            c(a= 1, b=2, c= 3),  # names from first
            c(A=10, B=0, C=-10))

     word <- function(C,k) paste(rep.int(C,k), collapse='')
     utils::str(mapply(word, LETTERS[1:6], 6:1, SIMPLIFY = FALSE))

     f <- function(x=1:3, y) c(x,y)
     vf <- Vectorize(f, SIMPLIFY = FALSE)
     f(1:3,1:3)
     vf(1:3,1:3)
     vf(y=1:3) # Only vectorizes y, not x

     # Nonlinear regression contour plot, based on nls() example

     SS <- function(Vm, K, resp, conc) {
         pred <- (Vm * conc)/(K + conc)
         sum((resp - pred)^2 / pred)
     }
     vSS <- Vectorize(SS, c("Vm", "K"))
     Treated <- subset(Puromycin, state == "treated")

     Vm <- seq(140, 310, len=50)
     K <- seq(0, 0.15, len=40)
     SSvals <- outer(Vm, K, vSS, Treated$rate, Treated$conc)
     contour(Vm, K, SSvals, levels=(1:10)^2, xlab="Vm", ylab="K")

