2013-03-22 17 views
9

Próbuję napisać ogólną funkcję do obliczania prawdopodobieństw pokrycia dla oszacowania przedziałowego proporcji dwumianowych w R. Mam zamiar to zrobić dla różnych metod przedziału ufności, np. Wald, Clopper-Pearson, przedziały HPD dla różnych przeżyć.Parametr funkcji jako argument w funkcji R

Idealnie chciałbym, aby była jedna funkcja, która może przyjąć jako argument metodę, która powinna zostać użyta do obliczenia interwału. Moje pytanie: jak mogę włączyć funkcję jako argument w innej funkcji?

Jako przykład, dla dokładnej Cloppera-Pearsona przedziału I mają następujące funkcje:

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

przypadku Dokładna (x, n) jest funkcją tylko obliczyć odpowiedni odstęp. Chciałbym mieć

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

tak, że mam jedną funkcję do obliczania prawdopodobieństwa pokrycia zamiast odrębną funkcję pokrycia dla każdej metody obliczania przedziału. Czy istnieje standardowy sposób, aby to zrobić? Nie byłem w stanie znaleźć wytłumaczenia.

Dzięki, James

+1

Możesz chcieć przeczytać https://github.com/hadle y/devtools/wiki/Functional-programming – hadley

+0

Dzięki za przydatne łącze. – jatotterdell

Odpowiedz

15

W R, funkcja może być dostarczony jako argument funkcji. Składnia odpowiada obiektowi niefunkcjonalnym.

Oto przykładowa funkcja.

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

Funkcja ta ma zastosowanie funkcji FUN do obiektu x.

Kilka przykładów z wektorem włącznie z numerami od 1 do 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 

ten nie ogranicza się do funkcji wbudowanych, ale współpracuje z dowolnej funkcji:

> 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

Jak dodać parametry funkcji dla funkcji "FUN"? – Kalle

2

można również zapisz nazwę funkcji jako zmienną znakową i wywołaj ją za pomocą polecenia do.call()

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