函数参数作为R函数的参数



我正试图编写一个通用函数来计算r中二项式比例的区间估计的覆盖概率。我打算为各种置信区间方法做这个,例如Wald, Clopper-Pearson, HPD区间用于不同的先验。

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

作为一个例子,对于确切的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(...)

使我有一个函数来计算覆盖概率,而不是为每一种间隔计算方法单独的覆盖函数。有什么标准的做法吗?我没能找到一个解释。

谢谢,詹姆斯。

在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

您还可以将函数名存储为字符变量,并使用do.call()

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

Hadley的文章给出了一个很好的(简单的)例子:

randomise <- function(f) f(runif(1e3))
randomise(mean)
#> [1] 0.5059199
randomise(mean)
#> [1] 0.5029048
randomise(sum)
#> [1] 504.245

最新更新