Un hoja.de.datos es una lista, por lo que a lo largo de las líneas de
#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;
}
y luego después de 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"
Use GET_CLASS
, GET_ATTR
y otras macros en Rdefines.h (o sus funciones equivalentes, como getAttrib
) para descubrir otra información sobre el marco de datos. Sin embargo, tenga en cuenta que un data.frame tiene una API que puede diferir de su estructura. Entonces, por ejemplo, la función R row.names
puede devolver algo diferente del valor almacenado en el atributo row.names. Creo que la mayoría de las funciones de .Call
operan en vectores atómicos, manteniendo la manipulación de objetos más complicados en el nivel R.
Esto es exactamente lo que estaba buscando. Gracias Martin. ¿Qué otros atributos de un marco de datos (nrows, rownames, colnames, is.factor, etc.) puedo consultar al pasar un DF y configurarlo al devolver un DF? RT – user151410
Agregué algunas oraciones sobre esto al final de la respuesta –
gracias. eso ayuda. RT – user151410