【问题标题】:Passing data from Fortran to R将数据从 Fortran 传递到 R
【发布时间】:2014-08-18 00:37:14
【问题描述】:

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

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

有谁知道将数据从 Fortran 发送到 R 的任何有效方法?我为此找到的唯一实用程序(RFortran)是仅限 Windows,而我的工作计算机是 Mac。我知道 R 拥有一个基本的 Fortran 接口,但我从 Fortran 调用 R,反之亦然,而且考虑到我发送的绘图参数的数量(轴标签、绘图标题、轴单位和限制等,很多其中是可选的,并且在我正在使用的当前例程中具有默认值)我不确定它是否具有我需要的功能。

【问题讨论】:

  • 您是否尝试将数据写入二进制格式?
  • 我还没有尝试过,虽然我已经考虑过了。
  • 你能直接从R调用Fortran函数吗?
  • 事实证明,R 中的二进制读取函数非常有用,并且由于 R 和 Fortran 都是列优先的,因此可以通过发送大型数组。二进制格式要求每一端都有五行代码。所以,我会同意的。谢谢。

标签: r csv plot interop fortran


【解决方案1】:

我会从 Fortran 编写 NetCDF 文件。这些文件可以包含大量的多维数据。在 Fortran 中创建 NetCDF 文件形式也有很好的绑定(它在气候模型中被大量使用)。此外,R 对使用 ncdf 包形式的 NetCDF 文件提供了出色的支持。例如,仅将数据立方体的一小部分读入内存(仅某些时间步长或某些地理区域)非常容易。最后,NetCDF 适用于所有平台。

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

【讨论】:

    【解决方案2】:

    所以,原来是通过发送数组。 Fortran 和 R 之间的未格式化文件非常容易。两者都是列优先的,因此只需传递一个包含数组的未格式化文件和另一个包含数组形状和大小信息的文件,然后将数据直接读入 R 中适当大小和形状的数组。

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

    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
    

    R 端(确保您的字节顺序正确,否则会惨遭失败):

    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
    

    如果需要,您可以将标头和数据放在同一个文件中。

    【讨论】:

      猜你喜欢
      • 2016-12-15
      • 1970-01-01
      • 2013-04-26
      • 2014-01-06
      • 1970-01-01
      • 1970-01-01
      • 2017-01-11
      • 2014-02-07
      • 1970-01-01
      相关资源
      最近更新 更多