使用.call()将dataframe从-R传递到R和C.

是否有通用方法将具有任意列(整数/因子,数字,字符数据)的dataframe从r传递回c并返回? 非常感谢能够关闭足够示例的指针。

谢谢。

RT

data.frame是一个列表,所以沿着

#include  SEXP df_fun(SEXP df) { int i, len = Rf_length(df); SEXP result; PROTECT(result = NEW_CHARACTER(len)); for (i = 0; i < len; ++i) switch(TYPEOF(VECTOR_ELT(df, i))) { case INTSXP: SET_STRING_ELT(result, i, mkChar("integer")); break; case REALSXP: SET_STRING_ELT(result, i, mkChar("numeric")); break; default: SET_STRING_ELT(result, i, mkChar("other")); break; }; UNPROTECT(1); return result; } 

然后在R CMD SHLIB df_fun.c

 > dyn.load("df_fun.so") > df=data.frame(x=1:5, y=letters[1:5], z=pi, stringsAsFactors=FALSE) > .Call("df_fun", df) [1] "integer" "other" "numeric" 

在Rdefines.h(或其等效函数,如getAttrib )中使用GET_CLASSGET_ATTR和其他宏来发现有关数据框的其他信息。 请注意,data.frame的API可能与其结构不同。 因此,例如R函数row.names可以返回与存储在row.names属性中的值不同的东西。 我认为大多数.Call函数在primefaces向量上运行,在R级别上保持对更复杂对象的操纵。

以下是使用C ++和 Dirk Eddelbeuttel 内联包的示例的链接 :

data.frame类型是具有“data.frame”属性的列表。

这是在R (src / library / stats / src / model.c)的源代码中创建data.frame的示例:

 /* Turn the data "list" into a "data.frame" */ /* so that subsetting methods will work. */ PROTECT(tmp = mkString("data.frame")); setAttrib(data, R_ClassSymbol, tmp); UNPROTECT(1); 

您可以通过以下方式手动模拟 data.frame:

 l <- list(1:5) attr(l, "class") <- "data.frame" attr(l, "names") <- "Column 1" attr(l, "row.names") <- paste("Row ", 1:5)