R中是否有对象关系映射包?

R中是否有对象关系映射包?,r,orm,dplyr,rmysql,R,Orm,Dplyr,Rmysql,所谓对象关系映射,我指的是这里描述的内容: 下面是我在R中的工作方式:一种虚拟数据帧链接到数据库,并在访问时返回SQL查询的结果。例如,headvirtual_list实际上会返回映射数据库上映射的_表limit 5的select*结果 我发现了这一点,但在过去3年中似乎没有任何进展 是否有实现此功能的工作包 如果没有, 它有用吗? 实施它的最佳方式是什么? 看来约翰·迈尔斯·怀特已经放弃了 这里解释了一点解决方法。有一个旧的不受支持的包,可以做到这一点。从源代码构建它并忽略大量错误消息 >

所谓对象关系映射,我指的是这里描述的内容:

下面是我在R中的工作方式:一种虚拟数据帧链接到数据库,并在访问时返回SQL查询的结果。例如,headvirtual_list实际上会返回映射数据库上映射的_表limit 5的select*结果

我发现了这一点,但在过去3年中似乎没有任何进展

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

如果没有,

它有用吗? 实施它的最佳方式是什么?
看来约翰·迈尔斯·怀特已经放弃了


这里解释了一点解决方法。

有一个旧的不受支持的包,可以做到这一点。从源代码构建它并忽略大量错误消息

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

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

dbGetQuery返回数据帧中的查询结果,dbWriteTable在表中插入数据或从数据帧执行批量更新


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

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

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

最新的包dplyr正在实现这一点以及其他惊人的功能

下面是函数src_mysql示例中的示例:


接下来是用于查询DBs DBI、RODBC、RJDBC、RMySql等的各种驱动程序包,。。。 还有dplyr,还有sqldf


这将自动将数据帧导入数据库&让您通过sql查询数据。最后,数据库被删除。

Oracle有一款产品可以在R中执行此操作。感谢您的回答。我同意记忆和锁定。这可能是一个问题,取决于项目。关于行选择的例子:一个完整的转换方案可能不可能,但至少很多常见的操作应该是可行的。例如,示例中的行选择将是微不足道的……行选择的例子对您来说是微不足道的。让我们更进一步:前10%的百分位数?随机n=100抽样?等在实践中,这种限制很快就达到了。我不同意这种观点:没有一种有用的语言是纯粹属于任何特定类型的。R声称是一种函数式语言,但它也允许许多副作用。R应该有办法创建ORM,我很高兴dplyr得到了改进。dplyr不支持将对象持久化到数据库,您仍然需要将INSERT写入语句。有很多方法可以做到这一点,但不推荐:这不是ORM方法。这只是从数据库中提取一个表并将其转换为data.frame/tbl。适当的ORM将数据库的条目(包括它们的关系)映射到编程语言中的对象/类。
# 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)