2013-03-22 28 views
9

Rの二項比の区間推定のカバレッジ確率を計算するための一般関数を記述しようとしています。 Wald、Clopper-Pearson、様々なプライオリティのHPD間隔。R関数の引数としての関数パラメータ

理想的には、間隔を計算するために使用するメソッドを引数として取ることができる関数が1つあります。次に私の質問:別の関数に関数を引数として含めるにはどうしたらいいですか?正確な(X、n)は、適切な間隔を計算するだけの関数である

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

:例として

は、正確なClopperピアソン間隔でIは、以下の機能を有します。私はカバレッジ確率ではなく間隔計算の各方法のための別々のカバレッジ関数を計算するための機能を有するように

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

したいと思います。これを行う標準的な方法はありますか?私は説明を見つけることができませんでした。

おかげで、Rは ジェームズ

+1

https://github.com/hadle y/devtools/wiki/Functional-programming – hadley

+0

役に立つリンクをありがとう。 – jatotterdell

答えて

15

は、関数は、関数の引数として提供することができます。構文は、非関数オブジェクトの1つと一致します。

ここでは関数の例を示します。

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

この関数はオブジェクトxに機能FUNを適用します。

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

2

することができますまた、関数名を文字変数として格納し、do.call()で呼び出します。

> test = c(1:5) 
> do.call(mean, list(test)) 
[1] 3 
> 
> func = 'mean' 
> do.call(func, list(test)) 
[1] 3 
関連する問題