2011-07-12 9 views

Respuesta

15

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.

+0

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

+0

Agregué algunas oraciones sobre esto al final de la respuesta –

+0

gracias. eso ayuda. RT – user151410

3

He aquí una link to an example using C++ and package inline por Dirk Eddelbeuttel:

+0

Gracias por la respuesta rápida. C++ no es una opción, ya que estoy restringido a c por diseño. – user151410

+0

¿Quizás mirando el código para '[<-' ??? –

+0

¿Por qué la restricción de C? Para R, está obligado a usar gcc, lo que significa que puede usar g ++ con la misma facilidad. Las API más fáciles superan a las API más duras en todo momento. Ah, y el ejemplo apuntado por DWin también puede devolver un data.frame. –

0

data.frame type es una lista con el atributo "data.frame".

Esto es ejemplo de creación de data.frame en fuente de R (src/library/estadísticas/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); 

Puede simular data.frame manualmente este manera:

l <- list(1:5) 
attr(l, "class") <- "data.frame" 
attr(l, "names") <- "Column 1" 
attr(l, "row.names") <- paste("Row ", 1:5) 
Cuestiones relacionadas