使用 .C() 从 R 调用已编译的 C

标签 c r

我正在尝试从 R 调用一个程序(C 可执行文件 measurementDensities_out 中的函数 getNBDensities)。该函数传递了几个数组和变量 double运行和。现在,getNBDensities 函数基本上什么都不做:它打印以筛选传递的参数值。我的问题是调用函数的语法:

array(.C("getNBDensities",
            hr = as.double(hosp.rate), # a vector (s x 1)
            sp = as.double(samplingProbabilities), # another vector (s x 1)
            odh = as.double(odh), # another vector (s x 1)
            simCases = as.integer(x[c("xC1","xC2","xC3")]), # another vector (s x 1)
            obsCases = as.integer(y[c("yC1","yC2","yC3")]), # another vector (s x 1)
            runsum = as.double(runsum), # double
            DUP = TRUE, NAOK = TRUE, PACKAGE = "measurementDensities_out")$f,
            dim = length(y[c("yC1","yC2","yC3")]),
            dimnames = c("yC1","yC2","yC3"))

在正确执行函数(即正确的输出打印到屏幕)后,我得到的错误是

Error in dim(data) <- dim : attempt to set an attribute on NULL

我不清楚我应该传递函数的维度是什么:它应该是 s x 5 + 1(五个长度为 s 的 vector 和一个 double vector )?我已经尝试了所有种类的组合(包括 sx5+1),但在网上只发现看似相互矛盾的描述/示例,说明这里应该发生什么。

有兴趣的可以看下面的C代码:

<code>#include <R.h></code>
<code>#include <Rmath.h></code>
<code>#include <math.h></code>
<code>#include <Rdefines.h></code>
<code>#include <R_ext/PrtUtil.h></code>
<code>#define NUM_STRAINS 3</code>
<code>#define DEBUG</code>
void getNBDensities(  double *hr, double *sp, double *odh, int *simCases, int *obsCases, double *runsum );
void getNBDensities( double *hr, double *sp, double *odh, int *simCases, int *obsCases, double *runsum ) {
<code>#ifdef DEBUG</code>
  for ( int s = 0; s < NUM_STRAINS; s++ ) {
    Rprintf("\nFor strain %d",s); 
    Rprintf("\n\tHospitalization rate = %lg", hr[s]);
    Rprintf("\n\tSimulation probability = %lg",sp[s]);
    Rprintf("\n\tSimulated cases = %d",simCases[s]);
    Rprintf("\n\tObserved cases = %d",obsCases[s]);
    Rprintf("\n\tOverdispersion parameter = %lg",odh[s]);
}
  Rprintf("\nRunning sum = %lg",runsum[0]);
<code>#endif</code>
}


简单的解决方案

虽然可能存在更好(即可能更快或语法更清晰)的解决方案(请参阅下面德克的回答),但以下代码简化是有效的:

     out<-.C("getNBDensities",
            hr = as.double(hosp.rate),
            sp = as.double(samplingProbabilities),
            odh = as.double(odh),
            simCases = as.integer(x[c("xC1","xC2","xC3")]),
            obsCases = as.integer(y[c("yC1","yC2","yC3")]),
            runsum = as.double(runsum))

可以在>out中访问变量。

最佳答案

您可能需要查看 inline使 C、C++ 或 Fortran 代码的编译、链接和加载变得轻而易举的包。

就是说,特别是如果 C++ 是您的另一个选择,另请查看 Rcpp允许您轻松地来回传输 R 和 C++ 对象的包。

关于使用 .C() 从 R 调用已编译的 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4707999/

相关文章:

c - 什么是 "for to by"循环?

r - Amazon Web Services - 如何每天运行一个脚本

r - 列表中每个数据框的行数

在不规则间隔内 reshape 和汇总数据

r - 按ID分组,新表的每个元素都是一个vector

c - C 中的 SIGSEGV(段错误)

c - C :Why this does not show incompatible type for fied fe; 中的结构

按字母顺序将 2 个字符串组合到另一个字符串中

r - 使用 R、RStudio Knit 到 PDF,如何传递波浪号以防止换行 "Table~\ref{table:data-from-phone}"?

c - 结构 - 解释输出 :