是否有通用方法将具有任意列(整数/因子,数字,字符数据)的数据帧从r传递回c并返回?非常感谢关闭足够示例的指示。
感谢。
RT
答案 0 :(得分:16)
data.frame是一个列表,所以沿着
行#include <Rdefines.h>
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"
使用GET_CLASS
,GET_ATTR
和Rdefines.h中的其他宏(或其等效函数,如getAttrib
)来发现有关数据框的其他信息。请注意,data.frame的API可能与其结构不同。因此,例如R函数row.names
可以返回与存储在row.names属性中的值不同的东西。我认为大多数.Call
函数都在原子向量上运行,在R级别上保持对更复杂对象的操作。
答案 1 :(得分:3)
这是Dirk Eddelbeuttel的link to an example using C++ and package inline:
答案 2 :(得分:1)
data.frame类型是一个带有&#34; data.frame&#34;的列表。属性。强>
这是在R 源代码中创建data.frame的示例(src / library / stats / src / model.c):
/* 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)