我在R中有一个简单的数据集,其中包含一个包含国家/地区编号代码(所有整数)的列和另一个包含每个国家/地区(所有双打)的列。
(编辑):示例R数据框如下所示:
我将此数据帧传递给R函数,然后使用.Call调用C函数。在这个C函数中,我想得到一个包含国家代码列表的int数组和一个包含国家/地区区域列表的单独双数组。因此,使用示例R数据框,我想得到一个包含1,2,3的int数组和一个包含50.5,63.4和120.2的double数组。
C代码:
#include <R.h>
#include <Rdefines.h>
SEXP trialfuncc(SEXP countryn, SEXP area) {
//initialize variables
int i, j, k, len = Rf_length(countryn);
int countrylist[len];
double arealist[len];
//check for data type for country code
for (i = 0; i < len; ++i) {
if(TYPEOF(VECTOR_ELT(countryn, i))!= INTSXP) {
/*error*/
error_return("Input data must be of type integer");
}
//else add to the array
else {
countrylist[i] = *INTEGER(VECTOR_ELT(countryn, i));
}
};
//Should I be initializing a pointer and doing this instead?
//countrylist = INTEGER(countryn);
//check for data type for country area
for (j = 0; j<len; j++) {
if(TYPEOF(VECTOR_ELT(area, j)) != REALSXP) {
/*error*/
error_return("Input data must be of type double");
}
//else add to the array
else {
arealist[j] = *REAL(VECTOR_ELT(area, j));
}
};
//Should I be initializing a pointer and doing this instead?
//arealist = REAL(area);
//test: Print this array to check whether countrylist is produced
for (k=0; k < len; k++) {
printf("%i\n",countrylist[k]);
}
}
R代码:
dyn.load("trialfunc.so")
#test function
trialfuncr <- function(data) { #where data is the data frame
#single data set for country name (first column)
countryn <- as.list(data[,1])
#single data set for area (second column)
area <- as.list(data[,2])
#Call the C function
.Call("trialfuncc",countryn,area)
}
我可以生成.so文件,但是当我获取R代码并使用数据集运行函数trialfuncr时,这不起作用。 R只是崩溃并重新启动。没有任何解释。
我的问题可能源于这样一个事实,即我不太了解R内部结构,而且我也不明白INTEGER和REAL做了什么功能(似乎无法谷歌文档)。任何简单的解释/链接/提示将不胜感激!