将数据从Fortran传递到R

将数据从Fortran传递到R,r,csv,plot,interop,fortran,R,Csv,Plot,Interop,Fortran,我目前正在用Fortran进行大量的数据分析。我一直使用R来绘制我的大部分结果,因为Fortran不适合可视化。到目前为止,数据集都是二维的,而且相当小,所以我没有使用将要打印的数据和各种打印参数写入.CSV文件的例程,而是使用系统调用运行读取文件并生成所需打印的R脚本 然而,我发现自己现在处理的是一些较大的3D数据集,我不知道是否可以以这种方式继续(值得注意的是,通过.CSV发送和正确读取3D数组相当困难,并且占用了大量多余的内存,考虑到数据集的大小,这是一个问题) 有人知道从Fortran向

我目前正在用Fortran进行大量的数据分析。我一直使用R来绘制我的大部分结果,因为Fortran不适合可视化。到目前为止,数据集都是二维的,而且相当小,所以我没有使用将要打印的数据和各种打印参数写入.CSV文件的例程,而是使用系统调用运行读取文件并生成所需打印的R脚本

然而,我发现自己现在处理的是一些较大的3D数据集,我不知道是否可以以这种方式继续(值得注意的是,通过.CSV发送和正确读取3D数组相当困难,并且占用了大量多余的内存,考虑到数据集的大小,这是一个问题)

有人知道从Fortran向R发送数据的有效方法吗?我找到的唯一实用工具(RFortran)是windows only,我的工作电脑是mac。我知道R拥有一个基本的Fortran接口,但我从Fortran调用R,而不是从Fortran调用R,而且考虑到我发送的打印参数的数量(轴标签、打印标题、轴单位和限制等,其中许多是可选的,在我使用的当前例程中具有默认值)我不确定它是否具有我需要的功能。

我会选择从Fortran编写文件。这些文件可以包含大量多维数据。在Fortran中创建NetCDF文件表单也有很好的绑定(在气候模型中经常使用)。此外,R还非常支持以
ncdf
包的形式使用NetCDF文件。例如,只将数据立方体的一小部分读入内存(仅某些时间步或某些地理区域)非常容易。最后,NetCDF可以跨所有平台工作


在工作流程方面,我会让fortran程序在一个单独的文件中生成NetCDF文件和一些图形参数(
data.nc
data.plt
),然后作为后处理步骤调用R。这样,您就不需要直接将R与fortran连接起来。管理整个工作流程可以通过一个单独的脚本(例如Python)来完成,该脚本调用Fortran模型,列出NetCDF/.plt文件并创建绘图。

因此,通过。Fortran和R之间的未格式化文件非常容易。两者都是列主文件,因此只需传递一个包含数组的未格式化文件和另一个包含数组形状和大小信息的未格式化文件,然后将数据直接读取到R中具有适当大小和形状的数组中

n维整数数组a的示例代码,维数i的大小为s(i)

Fortran端(访问必须设置为“流”,否则每次写入后都会插入额外的字节):

R-side(确保endianness正确,否则会失败得很惨):

testheader=文件(“testheader.dat”、“rb”)
testdata=file(“testdata.dat”、“rb”)

dims您是否尝试过以二进制格式编写数据?我还没有尝试过,尽管我已经考虑过。您能直接从R调用Fortran函数吗?Roman暗指:事实证明,R中的二进制读取函数非常有用,并且,由于R和Fortran都是列主格式,因此可以通过发送大型数组。二进制格式要求每端都有五行代码。所以,我同意这一点。谢谢
open(unit = 1, file="testheader.dat", form="unformatted", access="stream", status="unknown")
open(unit = 2, file="testdata.dat", form="unformatted", access="stream", status="unknown")

write(1) n
do i=1,n
    write(1) s(i)
enddo
write(2) a
testheader = file("testheader.dat", "rb")
testdata = file("testdata.dat", "rb")

dims <- readBin(testheader, integer(), endian="big")
sizes <- readBin(testheader, integer(), n=dims, endian="big")
dim(sizes) <- c(dims)
a <- readBin(testdata, integer(), n=prod(sizes), endian="big")
dim(a) <- sizes