R: Vectorize a Scalar Function

Vectorize {base} | R Documentation

## Vectorize a Scalar Function

### Description

`Vectorize` creates a function wrapper that vectorizes the action of its argument `FUN`.

### Usage

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

### Arguments

`FUN` | function to apply, found via `match.fun`.
`vectorize.args` | a character vector of arguments which should be vectorized. Defaults to all arguments of `FUN`.
`SIMPLIFY` | logical or character string; attempt to reduce the result to a vector, matrix or higher dimensional array; see the `simplify` argument of `sapply`.
`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.

### Details

The arguments named in the `vectorize.args` argument to `Vectorize` are the arguments passed in the `...` list to `mapply`. Only those that are actually passed will be vectorized; default values will not. See the examples.

`Vectorize` cannot be used with primitive functions as they do not have a value for `formals`.

It also cannot be used with functions that have arguments named `FUN`, `vectorize.args`, `SIMPLIFY` or `USE.NAMES`, as they will interfere with the `Vectorize` arguments. See the `combn` example below for a workaround.

### Value

A function with the same arguments as `FUN`, wrapping a call to `mapply`.

### Examples

    # We 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)

    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
    require(graphics)
    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, length.out = 50)
    K <- seq(0, 0.15, length.out = 40)
    SSvals <- outer(Vm, K, vSS, Treated$rate, Treated$conc)
    contour(Vm, K, SSvals, levels = (1:10)^2, xlab = "Vm", ylab = "K")

    # combn() has an argument named FUN
    combnV <- Vectorize(function(x, m, FUNV = NULL) combn(x, m, FUN = FUNV),
                        vectorize.args = c("x", "m"))
    combnV(4, 1:4)
    combnV(4, 1:4, sum)

[Package base version 4.0.5 Index]