将数据帧从C返回到R -

Gro*_*ero 6 c r dataframe

我按照这个链接

使用.call()将数据帧从-R传递到R和C.

找到在C里面访问R数据帧的方法.我的要求与此相反.我在C中有一个表格数据,需要在C中创建一个R数据框对象,并将其作为SEXP返回.

对于简单的R向量和列表创建,我遵循了此链接中的内容

http://adv-r.had.co.nz/C-interface.html

但我仍然想知道如何创建一个数据帧并从C返回到R.考虑到数据帧是一个列表,我尝试创建一个列表并将其传递,但​​它预计会在R中获取一个列表而不是数据帧.

任何帮助,将不胜感激.

gag*_*ews 11

你可能利用以下事实:一个data.frame对象是由原子矢量,每一个都具有相同的长度,与列表names,classrow.names属性适当地设定:

library(inline)
f <- cxxfunction(signature(), body="
   SEXP ret, ans1, ans2, cls, nam, rownam;
   PROTECT(ret = Rf_allocVector(VECSXP, 2)); // a list with two elements
   PROTECT(ans1 = Rf_allocVector(INTSXP, 3)); // first column
   PROTECT(ans2 = Rf_allocVector(INTSXP, 3)); // second column
   for (int i=0; i<3; ++i) { // some data
      INTEGER(ans1)[i] = i+1;
      INTEGER(ans2)[i] = -(i+1);
   }
   SET_VECTOR_ELT(ret, 0, ans1);
   SET_VECTOR_ELT(ret, 1, ans2);

   PROTECT(cls = allocVector(STRSXP, 1)); // class attribute
   SET_STRING_ELT(cls, 0, mkChar(\"data.frame\"));
   classgets(ret, cls);

   PROTECT(nam = allocVector(STRSXP, 2)); // names attribute (column names)
   SET_STRING_ELT(nam, 0, mkChar(\"a\"));
   SET_STRING_ELT(nam, 1, mkChar(\"b\"));
   namesgets(ret, nam);

   PROTECT(rownam = allocVector(STRSXP, 3)); // row.names attribute
   SET_STRING_ELT(rownam, 0, mkChar(\"1\"));
   SET_STRING_ELT(rownam, 1, mkChar(\"2\"));
   SET_STRING_ELT(rownam, 2, mkChar(\"3\"));
   setAttrib(ret, R_RowNamesSymbol, rownam);

   UNPROTECT(6);
   return ret;
")
Run Code Online (Sandbox Code Playgroud)

这使:

print(f())
##   a  b
## 1 1 -1
## 2 2 -2
## 3 3 -3
Run Code Online (Sandbox Code Playgroud)


Dir*_*tel 6

强制性 Rcpp 示例:

// [[Rcpp::export]] 
DataFrame createTwo(){
    IntegerVector v = IntegerVector::create(1,2,3);
    std::vector<std::string> s(3);
    s[0] = "a";
    s[1] = "b";
    s[2] = "c";
    return DataFrame::create(Named("a")=v, Named("b")=s);
}
Run Code Online (Sandbox Code Playgroud)

这将为您提供一个 3x2 的 data.frame,其中包含一个 char 向量和一个 int 向量。