2013-03-22 133 views
9

我正在嘗試編寫一個通用函數來計算R中二項式比例區間估計的覆蓋概率。我打算對各種置信區間方法進行此操作。 Wald,Clopper-Pearson,不同先質的HPD間隔。函數參數作爲R函數中的參數

理想情況下,我希望有一個函數,可以採用應該用來計算間隔的方法作爲參數。我的問題是:如何在另一個函數中包含函數作爲參數?

作爲一個例子,對於精確Clopper皮爾森間隔I具有以下功能:

# 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) 
} 

其中精確(X,N)僅僅是一個計算合適的間隔的功能。我想有

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

,這樣我有一個函數來計算覆蓋概率,而不是爲間隔計算的每個方法分離的覆蓋函數。有沒有一個標準的方法來做到這一點?我一直無法找到解釋。

謝謝, 詹姆斯

+1

您可能想要閱讀https://github.com/hadle y/devtools/wiki /功能編程 – hadley 2013-03-22 13:48:13

+0

感謝您的有用鏈接。 – jatotterdell 2013-03-22 21:29:13

回答

15

在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 
+0

如何爲傳遞函數「FUN」添加函數參數? – Kalle 2016-08-17 09:24:37

2

可以還存儲函數名稱作爲字符變量,並用do.call()調用它

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