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

5
在互联网上已经花了几天的时间寻找类似的内容,但我仍然找不到任何描述这个问题的东西。即使阅读了《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))会导致Error: invalid mode (closure) to pass to Fortran (arg 1)的错误,而将"asdf"(作为字符串)传递会导致段错误,因为该参数显然不符合预期类型(即函数)。

顺便说一下,我并不指望代码能做出任何有意义的事情(这将是另一个函数的任务),我主要想知道是否可能从R中传递函数(或函数指针),或者我最好立即放弃这种方法,寻找可能奏效的其他方法。

提前感谢您的帮助,

迪安

1个回答

2
您不能通过.Fortran传递R对象。您需要使用.Call.External接口将R对象传递给C/C++代码。
您可以为您的R函数编写一个C/C++包装器,然后从Fortran代码中调用它(请参见Writing R Extensions中的Calling-C-from-FORTRAN-and-vice-versa)。

那么,在R中,函数被视为一个对象? - Sty
是的,在Rcpp中,SEXP对象很容易传递函数。 - Dirk Eddelbuettel
@DirkEddelbuettel:您是否有任何花哨的Rcpp东西来处理调用Fortran,或者Fortran在Rcpp领域与C一样被禁止了?;-) - Joshua Ulrich
3
如您所知,R语言有四种接口:.C、.Call、.External和.Fortran。我通常涉及前两个,并提到您只应使用第二个而不是第一个。另外两个接口大多是R语言内部使用的,我在使用R和S语言的十五年里从未需要过它们。即使某些地方使用了Fortran,我也从未需要它,因为即使存在Fortran代码,也会有一个C网关,我们仍然可以使用默认的.Call接口。 - Dirk Eddelbuettel

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接