1

我正在编写一些关于 C 的 R 扩展(要从 R 调用的 C 函数)。

我的代码需要同时使用 2 个不同的数据集计算统计数据,并且我需要使用所有可能的配对组合来执行此操作。然后,我需要所有这些统计数据(非常大的数组)来继续 C 端的计算。这些文件非常大,通常约为 40GB,这就是我的问题。

要在 R 调用的 C 上执行此操作,首先我需要加载 R 中的所有数据集以将它们传递给 C 函数调用。但是,理想情况下,如果我能够直接从 C 或 Fortran 访问数据集,则可以按照顺序在内存中同时维护其中的 2 个文件:

open  file1 - open file2 - compute cov(1,2)
close file2
hold  file1 - open file3 - compute cov(1,3)
... // same approach

这在 R 上很好,因为我可以加载/卸载文件,但是在调用 C 或 Fortran 时,我没有任何机制来加载/卸载文件。所以,我的问题是,我可以直接从 Fortran 或 C 读取 .Rdata 文件,能够打开/关闭它们吗?还有其他解决问题的方法吗?

据我所读,答案是否定的。所以,我正在考虑从 Rdata 迁移到 HDF5。

4

1 回答 1

4

.Call使用接口从 C 调用 R 函数并不难。因此,编写一个输入数据的 R 函数,然后从 C 中调用它。当你完成一个文件时,UNPROTECT() 你读入的数据。如下所示

## function that reads my data in from a single file
fun <- function(fl)
    readLines(fl)

library(inline)  ## party trick -- compile C code from within R
doit <- cfunction(signature(fun="CLOSXP", filename="STRSXP", env="ENVSXP"), '
    SEXP lng = PROTECT(lang2(fun, filename)); // create R language expression
    SEXP ans = PROTECT(eval(lng, env));       // evaluate the expression
    // do things with the ans, e.g., ...
    int len = length(ans);
    UNPROTECT(2);                     // release for garbage collection
    return ScalarInteger(len);        // return something
')

doit(fun, "call.R", environment())

一种更简单的方法是反转问题——读取两个数据文件,然后用数据调用 C。

于 2014-11-17T23:43:36.840 回答