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

use*_*410 11 c r

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

谢谢.

RT

Mar*_*gan 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;
}
Run Code Online (Sandbox Code Playgroud)

之后 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"
Run Code Online (Sandbox Code Playgroud)

使用GET_CLASS,GET_ATTR并在Rdefines.h(或等同的功能,像其他宏getAttrib)来发现关于数据帧的其他信息.请注意,data.frame的API可能与其结构不同.因此,例如,R函数row.names可以返回与存储在row.names属性中的值不同的内容.我认为大多数.Call函数都是在原子向量上运行,在R级别上保持对更复杂对象的操作.