2012-07-24 29 views
5

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

Odpowiedz

2

Nie można przekazać obiekty R poprzez .Fortran. Aby przekazać obiekt R do kodu C/C++, należy użyć interfejsu .Call lub .External.

można napisać C/C++ otoki dla funkcji R, które można następnie połączyć z Fortran kodu (patrz Calling-C-from-FORTRAN-and-vice-versa w pisanie R Extensions).

+0

tak, funkcja jest traktowana jako obiekt w R? – DStevens

+0

Tak, obiekt SEXP i np. W Rcpp sprawiamy, że łatwo jest przekazać funkcję. –

+0

@DirkEddelbuettel: czy masz jakieś fajne rzeczy Rcpp do obsługi wywoływania Fortran, czy też Fortran jest verboten jako C na ziemi Rcpp? ;-) –

Powiązane problemy