花了几天时间在互联网上搜索这样的东西后,我仍然找不到任何描述这个问题的东西.阅读(其他非常值得推荐的)'写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传递函数(或函数指针)或者我是否更好立即采用这种方法,寻找可行的方法.
提前致谢,
院长
您不能通过 传递 R 对象.Fortran
。您需要使用.Call
或.External
接口将 R 对象传递给 C/C++ 代码。
您可以为 R 函数编写一个 C/C++ 包装器,然后可以从 Fortran 代码中调用该包装器(请参阅编写 R 扩展中的从 FORTRAN 调用 C,反之亦然)。