2012-07-24 18 views
5

Después de pasar algunos días buscando algo así en Internet, todavía no pude encontrar nada que describa este problema. Leyendo a través de la (por lo demás bastante recomendable) 'Writing R Extensions' no ofrece una solución también. Por lo tanto, esta es mi pregunta más urgente:Pasar funciones en R como argumentos .Forran

Es posible pasar funciones (por simplicidad, suponga una función R simple, en realidad, el problema es aún más feo) como parámetros de función/subrutina a Fortran a través de .Fortran (. ..) llamar - y si es así, ¿cómo?

I escribió dos funciones simples, a fin de probar esto, primero una subrutina Fortran (adaptado para utilizar la función I originalmente la intención de pasar, por lo tanto, las dimensiones un poco extraño en la interfaz):

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 

y una R sencilla función para pasar a la función anterior:

asdf <- function(a, s, d, f){x <- c(a, s, d, f)} 

Calling .Fortran("foo", asdf, vector(mode="numeric", length=22)) rendimientos Error: invalid mode (closure) to pass to Fortran (arg 1) y pasando "asdf" (como una cadena) da como resultado una violación de segmento, como el argumento, obviamente, no se ajusta al tipo esperado (a saber, una función).

FYI, no espero que el código haga algo significativo (esa sería la tarea de otra función), principalmente quisiera saber si es posible o no pasar funciones (o punteros a funciones) desde R Si prefiero renunciar a este enfoque al instante y buscar algo que pueda funcionar.

Gracias de antemano,

Dean

Respuesta

2

Usted no puede pasar a través de objetos R .Fortran. Debería utilizar la interfaz .Call o .External para pasar los objetos R al código C/C++.

Se podría escribir un/C envoltorio C++ para su función R, que luego se puede llamar desde el código Fortran (véase Calling-C-from-FORTRAN-and-vice-versa en escritura R Extensiones).

+0

Entonces, ¿una función se trata como un objeto en R? – DStevens

+0

Sí, un objeto SEXP, y por ejemplo, en Rcpp hacemos que sea bastante fácil pasar una función. –

+0

@DirkEddelbuettel: ¿tiene algún material elegante de Rcpp para manejar llamar a Fortran, o Fortran está tan protegido como C en Rcpp? ;-) –

Cuestiones relacionadas