2013-03-22 38 views
9

Sto tentando di scrivere una funzione generale per calcolare le probabilità di copertura per la stima a intervalli delle proporzioni binomiali in R. Intendo farlo per una varietà di metodi dell'intervallo di confidenza, ad es. Wald, Clopper-Pearson, intervalli di HPD per diversi priori.Parametro funzione come argomento in una funzione R

Idealmente, mi piacerebbe che ci fosse una funzione, che può assumere, come argomento, il metodo che dovrebbe essere usato per calcolare l'intervallo. La mia domanda allora: come posso includere una funzione come argomento in un'altra funzione?

Ad esempio, per l'esatto intervallo Clopper-Pearson Ho la seguente funzione:

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

Dove Exact (x, n) è solo una funzione per calcolare l'intervallo appropriato. Vorrei avere

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

modo da avere una funzione per calcolare la probabilità di copertura piuttosto che una funzione di copertura separata per ciascun metodo di calcolo dell'intervallo. C'è un modo standard per farlo? Non sono stato in grado di trovare una spiegazione.

Grazie, James

+1

Si consiglia di leggere https://github.com/hadle y/devtools/wiki/Programmazione funzionale – hadley

+0

Grazie per il link utile. – jatotterdell

risposta

15

In R, una funzione possono essere forniti come argomento di funzione. La sintassi corrisponde a quella degli oggetti non funzionali.

Ecco una funzione di esempio.

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

Questa funzione applica la funzione FUN all'oggetto x.

Alcuni esempi con un vettore compresi i numeri da 1 a 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 

Questo non è limitato alle funzioni built-in, ma funziona con qualsiasi funzione:

> 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

Come aggiungerei parametri di funzione per la funzione passata "FUN"? – Kalle

2

è possibile memorizzare anche un nome di funzione come variabile di carattere e chiamarlo con do.call()

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