19

(通过对象关系映射,我的意思是这里描述的内容:维基百科:对象关系映射。)

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

我找到了 John Myles White 的这篇文章,但过去 3 年似乎没有任何进展。

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

如果不,

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

6 回答 6

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)
于 2014-04-24T14:18:44.263 回答
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
于 2012-08-23T15:42:27.180 回答
2

看起来约翰迈尔斯怀特他已经放弃了。

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

于 2012-08-23T14:56:00.390 回答
1

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

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

于 2012-08-28T00:40:10.820 回答
1

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

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

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

于 2012-08-30T10:50:35.920 回答
1

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

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

于 2017-02-22T12:22:34.883 回答