我正在尝试从 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 )?我已经尝试了所有种类的组合(包括 s
x5+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/