2012-08-16 15 views
15

(Por mapeo objeto-relacional, me refiero a lo que se describe aquí:. Wikipedia: Object-relational mapping)¿Hay algún paquete para mapeo relacional de objetos en R?

Aquí es cómo podría imaginar este trabajo en I: una especie de "trama de datos virtual" está vinculado a una base de datos, y vuelve los resultados de las consultas SQL cuando se accede. Por ejemplo, head(virtual_list) realmente devolvería los resultados de (select * from mapped_table limit 5) en la base de datos mapeada.

He encontrado este post by John Myles White, pero parece que no ha habido progreso en los últimos 3 años.

¿Hay algún paquete que implemente esto?

Si no es así,

  1. ¿Sería útil?
  2. ¿Cuál sería la mejor manera de implementarlo (S4?)?
+0

Oracle tiene un producto que hace esto en R ... –

Respuesta

10

El muy reciente paquete dplyr está implementando esto (entre otras características increíbles).

Éstos son ejemplos de los ejemplos de la función src_mysql():

# Connection basics --------------------------------------------------------- 
# To connect to a database first create a src: 
my_db <- src_mysql(host = "blah.com", user = "hadley", 
    password = "pass") 
# Then reference a tbl within that src 
my_tbl <- tbl(my_db, "my_table") 

# Methods ------------------------------------------------------------------- 
batting <- tbl(lahman_mysql(), "Batting") 
dim(batting) 
colnames(batting) 
head(batting) 
2

Parece que John Myles White se ha dado por vencido.

Hay una pequeña solución explicada here.

7

Hay un paquete antiguo no admitido, SQLiteDF, que hace eso. Compilarlo desde la fuente e ignorar los numerosos mensajes de error.

> # from example(sqlite.data.frame) 
> 
> library(SQLiteDF) 
> iris.sdf <- sqlite.data.frame(iris) 
> iris.sdf$Petal.Length[1:10] # $ done via SQL 
[1] 1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 
1

No creo que sea útil. R no es un lenguaje OOP real. La estructura de datos "central" en R es el marco de datos. No hay necesidad de Object-Relational Mapping here.What desea es una asignación entre las tablas SQL y tramas de datos y la RMySQL y RODBC proporcionar sólo eso:

dbGetQuery para devolver los resultados de una consulta en una trama de datos y dbWriteTable para insertar datos en una tabla o hacer una actualización masiva (desde un marco de datos).

+0

¿No era lo suficientemente buena la dirección de clase R6? – jangorecki

+0

No estoy de acuerdo con este punto de vista: ningún lenguaje útil es "puramente" de ningún tipo en particular. R afirma ser un lenguaje funcional, pero también permite muchos efectos secundarios. R debería tener los medios para crear un ORM, y me alegro de que 'dplyr' intensifique. –

0

Como usuario con experiencia R, no usaría esto. En primer lugar, este 'marco virtual' sería lento de usar, ya que constantemente necesita sincronizar entre la memoria R y la base de datos. También requeriría bloquear la tabla de la base de datos, ya que de lo contrario tendrá resultados impredecibles debido a que otras ediciones suceden al mismo tiempo.

Finalmente, no creo que R sea adecuado para implementar una evaluación diferente de los objetos promise. Al hacer myFrame$foo[ myFrame$foo > 40 ], se buscará la columna completa foo, ya que no es posible implementar un esquema de traducción completo de R a SQL.

Por lo tanto, prefiero cargar un marco de datos() a partir de una consulta, usarlo y escribirlo de nuevo en la base de datos si es necesario.

+0

Gracias por su respuesta. Estoy de acuerdo con la memoria y el bloqueo. Eso podría ser un problema dependiendo del proyecto. Respecto al ejemplo de la selección de línea: un esquema de traducción completo podría no ser posible, pero al menos deben ser factibles muchas manipulaciones comunes (la selección de línea en el ejemplo sería trivial, por ejemplo) ... – nassimhddd

+0

El ejemplo de selección de línea es trivial para ti. Vamos a empujar esto más lejos: el 10 por ciento superior? Aleatorio n = 100 muestreo? etc ... En la práctica, los límites de esto se alcanzan muy rápidamente. – parasietje

1

Al lado de los diversos paquetes de controladores para la consulta de DB (DBI, RODBC, RJDBC, RMySql, ...) y dplyr, también hay sqldf https://cran.r-project.org/web/packages/sqldf/

Esto importará automáticamente tramas de datos en el DB & le permiten consultar los datos a través de SQL. Al final, se borra el db.

Cuestiones relacionadas