在R中是否有用于对象关系映射的包?

时间:2012-08-16 13:16:38

标签: r orm dplyr rmysql

(通过对象关系映射,我的意思是这里描述的内容:Wikipedia: Object-relational mapping。)

以下是我在R中想象这项工作的方式:一种“虚拟数据框架”链接到数据库,并在访问时返回SQL查询的结果。例如,head(virtual_list)实际上会在映射数据库上返回(select * from mapped_table limit 5)的结果。

我找到了post by John Myles White,但过去3年似乎没有任何进展。

是否有实现此功能的工作包?

如果没有,

  1. 会有用吗?
  2. 实施它的最佳方法是什么(S4?)?

6 个答案:

答案 0 :(得分:10)

最新的软件包dplyr正在实施此功能(以及其他令人惊叹的功能)。

以下是函数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)

答案 1 :(得分:7)

有一个旧的不受支持的包SQLiteDF,就是这样做的。从源代码构建它并忽略大量的错误消息。

> # 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

答案 2 :(得分:2)

看起来John Myles White已经放弃了它。

有一些解决方法解释here

答案 3 :(得分:1)

我认为这不会有用。 R不是真正的OOP语言。 R中的“中心”数据结构是数据帧。这里不需要对象关系映射。你想要的是SQL表和数据帧之间的映射,而RMySQL和RODBC只提供:

  

dbGetQuery 在数据框中返回查询结果, dbWriteTable 在表中插入数据或执行批量更新(从数据框中)。< / p>

答案 4 :(得分:1)

查询DB的各种驱动程序包旁边(DBI,RODBC,RJDBC,RMySql,...) 和dplyr一样,还有sqldf https://cran.r-project.org/web/packages/sqldf/

这会自动将数据帧导入db&amp;让你通过sql查询数据。最后删除数据库。

答案 5 :(得分:0)

作为一名经验丰富的R用户,我不会使用它。首先,这个“虚拟框架”使用起来很慢,因为你经常需要在R内存和数据库之间进行同步。它还需要锁定数据库表,否则由于同时发生其他编辑而导致结果不可预测。

最后,我认为R不适合对promise个对象进行不同的评估。执行myFrame$foo[ myFrame$foo > 40 ]仍然会获取完整的foo列,因为您无法实现从R到SQL的完整转换方案。

因此,我更喜欢从查询中加载dataframe(),使用它,并在需要时将其写回数据库。