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

时间:2011-07-12 00:09:13

标签: c r

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

感谢。

RT

3 个答案:

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

答案 1 :(得分:3)

答案 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)