簡體   English   中英

將數據幀從 C 返回到 R -

[英]Returning a data-frame from C to R -

我跟着這個鏈接

使用 .call() 將數據幀從 R 和 C 傳遞到 R 和 C

找到訪問 C 中的 R 數據框的方法。我的要求與此相反。 我在 C 中有一個表格數據,需要在 C 中創建一個 R 數據框對象並將其作為 SEXP 返回。

對於簡單的 R 向量和列表創建,我按照此鏈接中的內容進行操作

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

但我仍然想知道如何創建一個數據幀並從 C 返回到 R。考慮到數據幀是一個列表,我嘗試創建一個列表並將其傳遞,但​​它預計會在 R 中得到一個列表而不是數據幀。

任何幫助,將不勝感激。

您可以利用這樣一個事實,即data.frame對象是一個由原子向量組成的列表,每個向量都具有相同的長度,並正確設置了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

強制性 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);
}

這將為您提供一個 3x2 的 data.frame,其中包含一個 char 向量和一個 int 向量。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM