先前提到了R 中向量可以作为单独的参数传入函数中,函数会将参数中的元素一一执行并返回一个对应原先向量的新的向量:

    1. > my_f = function(x){ x*3 }
    2. > my_f(c(1,2,3,4,5))
    3. [1] 3 6 9 12 15

    但如果我们的函数中有条件句等接受标量的语句存在,就不能直接使用了:

    1. g <- function(x){
    2. if(abs(x) <= 1) {
    3. y <- x^2
    4. } else {
    5. y <- 1
    6. }
    7. y
    8. }

    这时候我们有几个选择:

    • 条件判断

    将if 判断句修改为条件判断:

    1. gv <- function(x){
    2. y <- numeric(length(x))
    3. sele <- abs(x) <= 1
    4. y[sele] <- x[sele]^2
    5. y[!sele] <- 1.0
    6. y
    7. }
    • ifelse 语句
    1. gv <- function(x){
    2. ifelse(abs(x) <= 1, x^2, 1)
    3. }
    • Vectorize 直接创建新的向量化函数
    1. > gv <- Vectorize(g)
    2. > gv
    3. function (x)
    4. {
    5. args <- lapply(as.list(match.call())[-1L], eval, parent.frame())
    6. names <- if (is.null(names(args)))
    7. character(length(args))
    8. else names(args)
    9. dovec <- names %in% vectorize.args
    10. do.call("mapply", c(FUN = FUN, args[dovec], MoreArgs = list(args[!dovec]),
    11. SIMPLIFY = SIMPLIFY, USE.NAMES = USE.NAMES))
    12. }
    13. <environment: 0x7facc2ab8d48>

    这时候可以直接调用新函数gv 了:

    1. gv(c(-2, -0.5, 0, 0.5, 1, 1.5))
    2. ## [1] 1.00 0.25 0.00 0.25 1.00 1.00
    • sapply 函数
    1. > sapply(c(-2, -0.5, 0, 0.5, 1, 1.5), g)
    2. [1] 1.00 0.25 0.00 0.25 1.00 1.00