在互联网上花了几天时间搜索类似的东西之后,我仍然无法找到任何描述这个问题的东西。通读(否则非常推荐)“编写 R 扩展”也没有提供解决方案。因此,这是我最紧迫的问题:
是否可以通过 .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))
yield
Error: invalid mode (closure) to pass to Fortran (arg 1)
并传递“asdf”(作为字符串)会导致段错误,因为参数显然不符合预期的类型(即函数)。
仅供参考,我不希望代码做任何有意义的事情(那将是另一个函数的任务),我主要想知道,是否可以从 R 传递函数(或函数指针)或者我是否最好给出立即采用这种方法并寻找可能有效的方法。
提前致谢,
院长