花了几天时间在互联网上搜索类似的内容后,我仍然无法找到任何描述此问题的内容。通读(否则非常值得推荐)“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/