(通过对象关系映射,我的意思是这里描述的内容:Wikipedia: Object-relational mapping。)
以下是我在R中想象这项工作的方式:一种“虚拟数据框架”链接到数据库,并在访问时返回SQL查询的结果。例如,head(virtual_list)
实际上会在映射数据库上返回(select * from mapped_table limit 5)
的结果。
我找到了post by John Myles White,但过去3年似乎没有任何进展。
是否有实现此功能的工作包?
如果没有,
答案 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(),使用它,并在需要时将其写回数据库。