Po kilku dniach szukania czegoś takiego w Internecie, wciąż nie udało mi się znaleźć niczego opisującego ten problem. Czytanie przez (inaczej całkiem godne polecenia) "Writing R Extensions" również nie oferuje rozwiązania. A zatem, oto moje najpilniejsze pytanie:Przekazywanie funkcji w R jako argumenty .Fortrana
Czy można przekazać funkcje (dla uproszczenia, załóżmy prostą funkcję R - w rzeczywistości problem jest jeszcze brzydszy) jako parametry funkcji/podprogramu do Fortran poprzez .Fortran (. ..) call - a jeśli tak, to w jaki sposób?
Napisałem dwie proste funkcje w celu przetestowania tego pierwszego jest Fortran podprogram (dostosowane do korzystania z funkcji I pierwotnie przeznaczone do przekazania, a tym samym trochę dziwne wymiary w interfejsie):
subroutine foo(o, x)
implicit none
interface
subroutine o(t, y, param, f)
double precision, intent(in) :: t
double precision, dimension(58), intent(in) :: y, param
double precision, dimension(22), intent(out) :: f
end subroutine
end interface
double precision, dimension(22), intent(out) :: x
double precision, dimension(58) :: yt, paramt
integer :: i
do i = 1, 58
yt(i) = rand(0)
paramt(i) = rand(1)
end do
call o(dble(4.2), yt, paramt, x)
end subroutine
oraz prostą funkcją R, aby przejść do powyższej funkcji:
asdf <- function(a, s, d, f){x <- c(a, s, d, f)}
Wywołanie .Fortran("foo", asdf, vector(mode="numeric", length=22))
wydajności Error: invalid mode (closure) to pass to Fortran (arg 1)
i przechodzącej „asdf” (jak na sznurkiem) powoduje segfault jako argument oczywiście nie montuje oczekiwany typ (mianowicie funkcja).
FYI, nie oczekuję, że kod zrobi cokolwiek znaczącego (byłoby to zadaniem innej funkcji), chciałbym przede wszystkim wiedzieć, czy przekazywane funkcje (lub wskaźniki funkcyjne) z R są w ogóle możliwe lub wolę Lepiej zrezygnować z tego podejścia natychmiast i szukać czegoś, co może zadziałać.
Dzięki z góry,
Dean
tak, funkcja jest traktowana jako obiekt w R? – DStevens
Tak, obiekt SEXP i np. W Rcpp sprawiamy, że łatwo jest przekazać funkcję. –
@DirkEddelbuettel: czy masz jakieś fajne rzeczy Rcpp do obsługi wywoływania Fortran, czy też Fortran jest verboten jako C na ziemi Rcpp? ;-) –