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级别上保持对更复杂对象的操作.