【问题标题】:Function parameter as argument in an R function函数参数作为 R 函数中的参数
【发布时间】:2013-03-22 09:33:55
【问题描述】:

我正在尝试编写一个通用函数来计算 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(...)

这样我就有一个函数来计算覆盖概率,而不是为每种区间计算方法提供一个单独的覆盖函数。有没有标准的方法来做到这一点?我一直找不到解释。

谢谢, 詹姆斯

【问题讨论】:

标签: r confidence-interval function credible-interval


【解决方案1】:

在 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,但对其他人来说:``` myfun
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    Hadley's text 给出了一个很棒(而且很简单)的例子:

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

    【讨论】: