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

DSt*_*ens 5 fortran r

花了几天时间在互联网上搜索这样的东西后,我仍然找不到任何描述这个问题的东西.阅读(其他非常值得推荐的)'写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
Run Code Online (Sandbox Code Playgroud)

和一个简单的R函数传递给上面的函数:

asdf <- function(a, s, d, f){x <- c(a, s, d, f)}
Run Code Online (Sandbox Code Playgroud)

调用.Fortran("foo", asdf, vector(mode="numeric", length=22))yield Error: invalid mode (closure) to pass to Fortran (arg 1)并传递"asdf"(作为字符串)会导致段错误,因为参数显然不符合预期类型(即函数).

仅供参考,我不希望代码做任何有意义的事情(这将是另一个函数的任务),我主要想知道,是否可以从R传递函数(或函数指针)或者我是否更好立即采用这种方法,寻找可行的方法.

提前致谢,

院长

Jos*_*ich 2

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

您可以为 R 函数编写一个 C/C++ 包装器,然后可以从 Fortran 代码中调用该包装器(请参阅编写 R 扩展中的从 FORTRAN 调用 C,反之亦然)。

  • @JoshuaUlrich:如您所知,有四个接口:.C、.Call、.External 和.Fortran。我通常会介绍前两个,并提到您不应该使用第一个,而只能使用第二个。另外两个主要是 R 内部的,在 R 和 S 使用的十五年里我从来没有需要过它们。我从来不需要 Fortran,因为即使它在某个地方使用,C 网关也存在,我们又回到了 .Call 的默认使用。 (3认同)