r - 将 R 中的函数作为 .Fortran 参数传递

标签 r fortran

花了几天时间在互联网上搜索类似的内容后,我仍然无法找到任何描述此问题的内容。通读(否则非常值得推荐)“Writing R Extensions”也没有提供解决方案。因此,这是我最紧迫的问题:

是否可以通过 .Fortran(...) 调用将函数(为简单起见,假设一个简单的 R 函数 - 实际上,问题更难看)作为函数/子例程参数传递给 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)) 会产生 错误:传递给 Fortran (arg 1) 的模式(闭包)无效 并传递“asdf”(作为字符串)会导致段错误,因为参数显然不符合预期类型(即,一个函数)。

仅供引用,我不希望代码做任何有意义的事情(那将是另一个函数的任务),我主要想知道,是否可以从 R 传递函数(或函数指针),或者是否可以我最好立即放弃这种方法并寻找可能有效的方法。

提前致谢,

院长

最佳答案

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

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

关于r - 将 R 中的函数作为 .Fortran 参数传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11630830/

相关文章:

python - 似乎无法让 fortran 可执行文件通过 python 正确运行

r - Data.frame 列中的公式

memory-management - 为什么以下 Fortran 代码根据派生类型的内容在堆栈/堆上进行分配?

fortran - 错误 : Rank mismatch in argument (rank-1 and scalar)

fortran - 第一列中的 "d"标签,Fortran 77

input - 尝试将不正确的值读入变量会改变其值吗?

r - 有没有办法在 sparkR 中加载 .RData 或 .model 文件(使用数据 block )?

python - python pandas或Filter中的管道或函数序列然后汇总(如dplyr)

减少同一列中的因子水平

r - 如何撤消生存对象(返回数据框)