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
Entonces, ¿una función se trata como un objeto en R? – DStevens
Sí, un objeto SEXP, y por ejemplo, en Rcpp hacemos que sea bastante fácil pasar una función. –
@DirkEddelbuettel: ¿tiene algún material elegante de Rcpp para manejar llamar a Fortran, o Fortran está tan protegido como C en Rcpp? ;-) –