使用使用者定義的功能

使用者定義的功能

使用者可以根據不同程度的複雜性建立自己的功能。以下示例來自 Hadley Wickham 的 Functionals

randomise <- function(f) f(runif(1e3))
        
lapply2 <- function(x, f, ...) {
    out <- vector("list", length(x))
    for (i in seq_along(x)) {
        out[[i]] <- f(x[[i]], ...)
    }
    out
}

在第一種情況下,randomise 接受單個引數 f,並在 Uniform 隨機變數樣本上呼叫它。為了證明等價,我們在下面稱為 set.seed

set.seed(123)
randomise(mean)
#[1] 0.4972778
    
set.seed(123)
mean(runif(1e3))
#[1] 0.4972778

set.seed(123)
randomise(max)
#[1] 0.9994045

set.seed(123)
max(runif(1e3))
#[1] 0.9994045

第二個例子是 base::lapply 的重新實現,它使用函式將操作(f)應用於列表中的每個元素(x)。... 引數允許使用者將其他引數傳遞給 f,例如 mean 函式中的 na.rm 選項:

lapply(list(c(1, 3, 5), c(2, NA, 6)), mean)
# [[1]]
# [1] 3
# 
# [[2]]
# [1] NA

lapply2(list(c(1, 3, 5), c(2, NA, 6)), mean)
# [[1]]
# [1] 3
# 
# [[2]]
# [1] NA

lapply(list(c(1, 3, 5), c(2, NA, 6)), mean, na.rm = TRUE)
# [[1]]
# [1] 3
# 
# [[2]]
# [1] 4

lapply2(list(c(1, 3, 5), c(2, NA, 6)), mean, na.rm = TRUE)
# [[1]]
# [1] 3
# 
# [[2]]
# [1] 4