2012-08-14 8 views
16

Załóżmy, że masz funkcję f<- function(x,y,z) { ... }. Co byś zrobił, przechodząc od jednej do drugiej, ale pozwalając, by inni byli różni? Innymi słowy, chciałbym zrobić coś takiego:Korzystanie z funkcji zewnętrznej() z funkcją wielu zmiennych

output <- outer(x,y,f(x,y,z=2)) 

Ten kod nie jest oceniany, ale czy istnieje sposób, aby to zrobić?

+1

Wiesz co, ja zrealizowałem ja często robi tego typu rzeczy z 'do.call (lapply, c (expand.grid (x, y), lista (F)))', ale 'zewnętrzny' jest zdecydowanie lepszy i bardziej czytelny. – Backlin

Odpowiedz

18
outer(x, y, f, z=2) 

Argumenty po zakończeniu funkcji są dodatkowe argumenty do niego, zobacz ... w ?outer. Ta składnia jest bardzo powszechna w R, cała rodzina apply działa na tym samym poziomie.

Aktualizacja:

Nie mogę powiedzieć dokładnie, co chcesz osiągnąć w swoim Kontynuacja pytanie, ale myślę rozwiązaniem w tej formie jest chyba to, co należy używać.

outer(sigma_int, theta_int, function(s,t) 
    dmvnorm(y, rep(0, n), y_mat(n, lambda, t, s))) 

Oblicza matrycę odchylenia dla każdej kombinacji wartości w sigma_int i theta_int, że matrycy używa się do określenia dennsity i ocenia to w punkcie (a), zdefiniowanego w y. Nie byłem w stanie tego przetestować, ponieważ nie znam typów i wymiarów zmiennych.

+0

To takie proste, muszę się wiele nauczyć o R Widzę ... Wielkie dzięki! – Stijn

+0

Tak, to proste ... kiedy już to wiesz;) – Backlin

+0

Przepraszam, że znowu przeszkadzam, ale co, jeśli mam funkcję zależną od innej funkcji? Na przykład powiedzmy, że mam dwa interwały i dla każdego z dwóch elementów z tych przedziałów chcę (i) utworzyć powiązaną macierz wariancji i (ii) obliczyć gęstość w tym punkcie (wielowariantowy rozkład normalny). Aby utworzyć macierz wariancji, mam funkcję y_mat (n, lambda, theta, sigma). Biorąc pod uwagę dwa interwały sigma_int i theta_int, chcę zrobić coś jak z <- outer (sigma_int, theta_int, dmvnorm, x = y, mean = rep (0, n), sigma = y_mat (n, lambda, theta, sigma)). czy to możliwe? – Stijn

2

(wraz z rodziną funkcji i innymi) przekaże dodatkowe argumenty do funkcji, które wywołują. Jeśli jednak masz do czynienia z przypadkiem, w którym nie jest to obsługiwane (optim jest jednym z przykładów), możesz użyć bardziej ogólnego podejścia do curry. Funkcja "curry" polega na utworzeniu nowej funkcji, która ma (niektóre) zmienne stałe i dlatego ma mniej parametrów.

library("functional") 
output <- outer(x,y,Curry(f,z=2)) 
Powiązane problemy