2012-08-16 49 views
15

(通过对象关系映射,我的意思是这里描述:Wikipedia: Object-relational mapping在R中是否有一个用于对象关系映射的包?

这里是我能想象在读该工作:一种“虚拟数据帧”是链接到数据库,并返回访问时SQL查询的结果。例如,head(virtual_list)实际上会在映射的数据库上返回(select * from mapped_table limit 5)的结果。

我发现这post by John Myles White,但似乎在过去3年没有进展。

是否有工作包实现了这一点?

如果没有,

  1. 将是有益的?
  2. 什么是实施它的最佳方式(S4?)?
+0

Oracle有一个产品可以在R ... – 2012-08-16 20:59:03

回答

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) 
2

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

有一些解决方法解释here

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 
1

我认为这不会有用。 R不是真正的OOP语言。 R中的“中心”数据结构是数据帧。无需对象 - 关系映射here.What你想要的是SQL表和数据帧和RMySQL和RODBC之间的映射提供了这一点:

dbGetQuery返回查询的结果在数据帧和dbWriteTable将数据插入到表中或执行批量更新(从数据框)。

+0

没有R6类地址OOP够好吗? – jangorecki 2015-07-14 20:17:19

+0

我不同意这种观点:没有有用的语言是纯粹的任何特定类型。 R声称是一种功能性语言,但它也允许许多副作用。 R应该有办法创建一个ORM,我很高兴'dplyr'加强了。 – 2017-12-28 22:29:21

0

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

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

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

+0

感谢您的回答。我同意记忆和锁定。这可能是一个问题,取决于项目。关于行选择的例子:完整的翻译方案可能不可行,但是至少大量的常见操作应该是可行的(例如,示例中的行选择将是微不足道的)... – nassimhddd 2012-08-30 12:18:32

+0

行选择示例是对你来说微不足道。让我们进一步推进:前10%的百分点?随机n = 100次采样?等等......在实践中,这个限制很快就达到了。 – parasietje 2012-08-30 13:53:46

1

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

这会自动导入数据帧到db中&让你通过sql查询数据。最后,数据库被删除。