我点击了此链接

Passing a data frame from-to R and C using .call()

找到访问C中的R数据帧的方法。
我的要求与此相反。我在C中有一个表格数据,需要在C中创建一个R数据框对象,并以SEXP形式返回。

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

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

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

任何帮助,将不胜感激。

最佳答案

您可以利用以下事实:data.frame对象是由原子 vector 组成的列表,每个原子 vector 具有相同的长度,并且正确设置了namesclassrow.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;
')
产生:
print(f())
##   a  b
## 1 1 -1
## 2 2 -2
## 3 3 -3

关于c - 将数据帧从C返回到R-,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23547625/

10-12 16:30
查看更多