我看到三种可能性:
-
您单独编译Fortran程序,并用R函数调用它system()
。您必须以该程序可以读取的格式通过文件传递数据。
-
您编译一个从 R 加载的 DLLdyn.load()
,然后调用 Fortran 函数.Fortran()
。您可以轻松传递数值数据(标量、向量或数组),但字符串数据更难处理。数组是copied.
-
这种调用 DLL 函数的机制被认为过于简单,现在.Call()
是首选,但要使用.Call()
你必须编写 C 包装器。
我将举第二种可能性的例子。
考虑 Fortran 中的一个子例程,它通过 Horner 算法计算多项式:
subroutine horner(n, a, x, y)
implicit none
integer :: n, i
double precision :: a(n), x, y
y = a(n)
do i = n - 1, 1, -1
y = y * x + a(i)
end do
end subroutine
从命令行编译:
R CMD SHLIB horner.f90
从 R 调用它:
dyn.load("horner.dll")
horner <- function(a, x) {
.Fortran("horner", as.integer(length(a)), a, x, y=0)$y
}
horner(c(-2, 0, 1), 1.414)
如果您希望 Fortran 子例程将某些内容打印到 RStudio 控制台,您需要执行以下操作(至少在 Windows 上):
Sys.unsetenv("GFORTRAN_STDOUT_UNIT")
Sys.unsetenv("GFORTRAN_STDERR_UNIT")
这确实是一个微不足道的例子,更复杂的程序将需要更多的工作,但你明白了。
如果您的 Fortran 程序是独立的(它有一个“程序”单元,并且应该编译为从命令行调用的可执行文件),并且如果您是 Fortran 新手,我建议坚持第一个选择,这将变得简单得多。这就是seasonal https://cran.r-project.org/web/packages/seasonal/打包的作用:调用 Census 的可执行文件X13AS https://www.census.gov/srd/www/x13as/从 R 内部。可执行文件位于x13二进制 https://cran.r-project.org/web/packages/x13binary/包裹。