Un data.frame è una lista, quindi lungo le linee di
#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;
}
e poi, dopo 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"
Utilizzare GET_CLASS
, GET_ATTR
e altre macro in Rdefines.h (o le loro funzioni equivalenti, come getAttrib
) per scoprire altre informazioni sul frame di dati. Si noti però che un data.frame ha un'API che può differire dalla sua struttura. Ad esempio, la funzione R row.names
può restituire qualcosa di diverso dal valore memorizzato nell'attributo row.names. Penso che la maggior parte delle funzioni .Call
funzionino su vettori atomici, mantenendo la manipolazione di oggetti più complicati a livello R.
fonte
2011-07-12 05:14:46
Questo è esattamente quello che stavo cercando. Grazie Martin. Quali altri attributi di un frame di dati (nrows, rownames, colnames, is.factor ecc.) Posso interrogare quando si passa un DF e si imposta quando si restituisce un DF? RT – user151410
Ho aggiunto alcune frasi su questo alla fine della risposta –
grazie. questo aiuta RT – user151410