我目前正在Fortran中进行大量数据分析。我一直在使用R绘制我的大部分结果,因为Fortran不适合可视化。到目前为止,数据集已经是二维的而且相当小,所以我已经完成了将数据绘制和各种绘图参数写入.CSV文件并使用系统调用的例程。运行一个R脚本来读取文件并生成所需的图。
然而,我发现自己现在正在处理更大的3D数据集,我不知道我是否可以以这种方式继续(特别是,通过.CSV发送和正确读取3D数组相当困难,并且占用了大量的超额内存,考虑到数据集的大小,这是个问题。)
有没有人知道从Fortran向R发送数据的有效方法?我找到的唯一的实用程序(RFortran)是仅限Windows,我的工作计算机是mac。我知道R拥有一个基本的Fortran界面,但是我从Fortran调用R,反之亦然,而且考虑到我发送的绘图参数的数量(轴标签,绘图标题,轴单位和限制等,很多其中一些是可选的,并且在我正在使用的当前例程中有默认值)我不确定它是否具有我需要的功能。
答案 0 :(得分:4)
我会去写Fortran的NetCDF
文件。这些文件可以包含大量的多维数据。在Fortran中创建NetCDF文件也有很好的绑定(在气候模型中使用很多)。此外,R还支持以ncdf
包的形式使用NetCDF文件。例如,很容易只将数据立方体的一小部分读入内存(仅一些时间步,或某些地理区域)。最后,NetCDF适用于所有平台。
就工作流程而言,我会让fortran程序在单独的文件(例如data.nc
和data.plt
)中生成NetCDF文件和一些图形参数,然后作为后处理步骤调用R.这样你就不需要直接连接R和Fortran了。管理整个工作流程可以通过单独的脚本(例如Python)完成,该脚本调用Fortran模型,生成NetCDF / .plt文件列表并创建图。
答案 1 :(得分:1)
因此,事实证明通过发送数组。 Fortran和R之间的无格式文件非常简单。两者都是列专业,所以只需要传递包含数组的无格式文件和另一个包含数组形状和大小信息的文件,然后将数据直接读入R中适当大小和形状的数组中。
n维整数数组的示例代码,a,维度i的大小为s(i)。
Fortran-side(访问必须设置为" stream,"否则每次写入后都会插入额外的字节):
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
R-side(确保你有正确的字节顺序,否则这将失败):
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
如果需要,您可以将标题和数据放在同一个文件中。