在C中创建包含来自R数据框

时间:2016-05-28 06:06:27

标签: c arrays r

我在R中有一个简单的数据集,其中包含一个包含国家/地区编号代码(所有整数)的列和另一个包含每个国家/地区(所有双打)的列。

(编辑):示例R数据框如下所示:

R sample data frame

我将此数据帧传递给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做了什么功能(似乎无法谷歌文档)。任何简单的解释/链接/提示将不胜感激!

0 个答案:

没有答案