2012-07-24 89 views
5

花费了几天的时间在网上搜索这样的东西之后,我仍然找不到任何描述这个问题的东西。阅读(另外很值得推荐的)'写作R扩展'也不会提供解决方案。因此,这是我最紧迫的问题:在R中传递函数作为.Fortran参数

是否可以通过.Fortran()函数将函数(为简单起见,假设一个简单的R函数 - 实际上,问题甚至更丑)作为函数/子程序参数传递给Fortran。 ..)电话 - 如果是这样,怎么办?

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 

和a:

我为了测试这一点,首先一个Fortran子程序(适合于使用我原先打算通过的功能,从而在界面处的有点奇怪的尺寸)写了两个简单的功能简易R函数传递给上述功能:

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

调用.Fortran("foo", asdf, vector(mode="numeric", length=22))产量 Error: invalid mode (closure) to pass to Fortran (arg 1)和传递“ASDF”(字符串)导致段错误,作为参数明显不适合预期类型(即功能)。我不希望代码做任何有意义的事(这将是另一个函数的任务),我主要想知道,是否可以根据R传递函数(或函数指针),或者我更好地立即放弃这种方法,并寻找可能有用的东西。

由于提前,

院长

回答

2

无法通过.Fortran通道R对象。您需要使用.Call.External接口将R对象传递给C/C++代码。

你可以写你的一个R函数,然后你可以从你的Fortran代码调用C/C++包装(见Calling-C-from-FORTRAN-and-vice-versa写作R附加)。

+0

所以,一个函数被视为R中的一个对象? – DStevens 2012-07-24 13:14:22

+0

是的,一个SEXP对象,例如在Rcpp中,我们可以很容易地传递一个函数。 – 2012-07-24 13:15:30

+0

@DirkEddelbuettel:你有任何花哨的Rcpp来处理调用Fortran的东西,还是Fortran在Rcpp的土地上用C来表达? ;-) – 2012-07-24 13:19:49