我试图从R 调用一个程序(getNBDensitiesC可执行文件中measurementDensities_out的函数).该函数传递了几个数组和变量double runsum.现在,该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
Run Code Online (Sandbox Code Playgroud)
我不清楚我应该传递函数的尺寸是什么:它应该是sx 5 + 1(五个向量长度s和一个双向)?我已经尝试过各种各样的组合(包括sx5 + 1),并且在网上找到了看似矛盾的描述/例子,这里应该发生什么.
对于那些感兴趣的人,C代码如下:
#include <R.h>
#include <Rmath.h>
#include <math.h>
#include <Rdefines.h>
#include <R_ext/PrtUtil.h>
#define NUM_STRAINS 3
#define DEBUG
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 ) {
#ifdef DEBUG
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]);
#endif
}
天真的解决方案
虽然可能存在更好的(即,可能更快或语法更清晰)的解决方案(参见下面的Dirk的答案),但以下代码的简化工作:
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.