在R中传递函数作为.Fortran参数

时间:2012-07-24 12:25:36

标签: r fortran

花了几天时间在网上搜索这样的东西后,我仍然找不到任何描述这个问题的东西。阅读(否则非常值得推荐)“写入R扩展”也不能提供解决方案。因此,这是我最迫切的问题:

是否可以传递函数(为简单起见,假设一个简单的R函数 - 实际上,问题甚至更加困难)作为Fortran通过.Fortran(...)调用的函数/子例程参数 - 如果是这样,如何?

为了测试这个,我编写了两个简单的函数,首先是一个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

和一个简单的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传递函数(或函数指针)或者是否可能我最好立即放弃这种方法,寻找可行的方法。

提前致谢,

迪安

1 个答案:

答案 0 :(得分:2)

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

你可以为你的R函数编写一个C / C ++包装器,然后你可以从你的Fortran代码中调用它(参见 Writing R Extensions 中的Calling-C-from-FORTRAN-and-vice-versa)。