编写一个带有参数的函数,该参数指示要应用的函数

use*_*037 2 r

有没有办法编写一个函数,其中一个参数指示要应用的函数?

例如,如果我有一个功能:

mf = function(data, option, level)
Run Code Online (Sandbox Code Playgroud)

在这里我想选项来告诉是否计算mean,mediansd数据集的?

Rei*_*son 5

是的,一个选项就是将函数传递给option.例如

mf <- function(data, option) {
    option <- match.fun(option)
    option(data)
}

set.seed(42)
dat <- rnorm(10)
mf(dat, option = mean)
Run Code Online (Sandbox Code Playgroud)

这使:

> set.seed(42)
> dat <- rnorm(10)
> mean(dat)
[1] 0.5472968
> mf(dat, option = mean)
[1] 0.5472968
> sd(dat)
[1] 0.8354488
> mf(dat, option = sd)
[1] 0.8354488
Run Code Online (Sandbox Code Playgroud)

match.fun()是与可用功能匹配的标准R方式.在示例中,我传递函数本身,但match.fun()允许其他方式引用函数,例如作为字符串:

> mf(dat, option = "mean")
[1] 0.5472968
Run Code Online (Sandbox Code Playgroud)

match.fun()返回一个可以用作任何其他函数的函数,因此它option()是一个与传递给option参数的函数基本相同的函数,或者是参数中指定的option函数.

目前尚不清楚这个level论点应该如何用于我忽略了上述内容.

我应该补充一点,如果你想将任何参数传递给应用函数,那么你将要...在函数定义中使用,例如:

mf <- function(data, option, ...) {
    option <- match.fun(option)
    option(data, ...)
}
Run Code Online (Sandbox Code Playgroud)

因此我们可以做这样的事情

set.seed(42)
dat2 <- rnorm(10)
dat2[4] <- NA
mean(dat2)
mean(dat2, na.rm = TRUE)
mf(dat2, mean, na.rm = TRUE)
Run Code Online (Sandbox Code Playgroud)

最后三行给出

> mean(dat2)
[1] NA
> mean(dat2, na.rm = TRUE)
[1] 0.5377895
> mf(dat2, mean, na.rm = TRUE)
[1] 0.5377895
Run Code Online (Sandbox Code Playgroud)