在R函数中将函数参数作为参数传递

10

我正在尝试编写一个通用函数,在R中计算二项式比例的区间估计覆盖概率。我打算使用各种置信区间方法(例如Wald、Clopper-Pearson、HPD区间)来实现这一点。

理想情况下,我希望有一个函数,可以将应该用于计算区间的方法作为参数传递进去。我的问题是:如何在另一个函数中包含一个函数作为参数?

以Exact Clopper-Pearson区间为例,我有以下函数:

# Coverage for Exact interval
ExactCoverage <- function(n) {
p <- seq(0,1,.001)
x <- 0:n

# value of dist
dist <- sapply(p, dbinom, size=n, x=x)

# interval
int <- Exact(x,n)

# indicator function
ind <- sapply(p, function(x) cbind(int[,1] <= x & int[,2] >= x))

list(coverage = apply(ind*dist, 2, sum), p = p)
}

Exact(x,n)是一个用于计算适当间隔的函数。我希望拥有。

Coverage <- function(n, FUN, ...)
...
# interval
int <- FUN(...)

我希望只有一个函数用于计算覆盖概率,而不是为每种区间计算方法单独编写一个覆盖函数。是否有标准的方法可以实现这一点?我尚未找到解释。

谢谢, 詹姆斯


1
你可能想阅读 https://github.com/hadley/devtools/wiki/Functional-programming - hadley
3个回答

16

在R中,可以将函数作为函数参数提供。语法与非函数对象的语法相匹配。

下面是一个示例函数。

myfun <- function(x, FUN) {
  FUN(x)
}

这个函数将函数FUN应用到对象x上。

以下是一些使用包含1到10数字的向量的示例:

vec <- 1:10 

> myfun(vec, mean)
[1] 5.5
> myfun(vec, sum)
[1] 55
> myfun(vec, diff)
[1] 1 1 1 1 1 1 1 1 1

这不仅限于内置函数,而是适用于任何函数:

> myfun(vec, function(obj) sum(obj) / length(obj))
[1] 5.5

mymean <- function(obj){
  sum(obj) / length(obj)
}
> myfun(vec, mymean)
[1] 5.5

你如何为传递的函数“FUN”添加函数参数? - Christian
1
这真的很晚了@Christian,但对于其他人:myfun <- function(x, FUN, ...) { FUN(x, ...) } - Alfredo G Marquez

2

你也可以将函数名存储为字符变量,并使用do.call()调用它。

> test = c(1:5)
> do.call(mean, list(test))
[1] 3
> 
> func = 'mean'
> do.call(func, list(test))
[1] 3

0

Hadley的文章提供了一个很好(而且简单)的例子:

randomise <- function(f) f(runif(1e3))

randomise(mean)
#> [1] 0.5059199
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接