Есть ли пакет для объектно-реляционного отображения в R?

(По объектно-реляционному отображению я имею в виду то, что описано здесь: Википедия: объектно-реляционное сопоставление.)

Вот как я мог представить эту работу в R: своего рода "виртуальный кадр данных" связан с базой данных и возвращает результаты SQL-запросов при обращении. Например, head(virtual_list) фактически вернет результаты (select * from mapped_table limit 5) в сопоставленной базе данных.

Я нашел этот пост Джона Майлса Уайта, но, похоже, за последние 3 года не было никакого прогресса.

Есть ли рабочий пакет, который реализует это?

Если нет,

  • Было бы полезно?
  • Что было бы лучшим способом его реализовать (S4?)?

Ответы

Ответ 1

Последний пакет 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

Существует старый неподдерживаемый пакет 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

Ответ 3

Похоже, Джон Майлс Уайт отказался от него.

Существует несколько способов обхода здесь.

Ответ 4

Я не думаю, что это было бы полезно. R не является реальным языком ООП. "Центральная" структура данных в R является фреймом данных. Здесь нет необходимости в объектно-реляционном сопоставлении. Что вы хотите - это сопоставление между таблицами SQL и кадрами данных, а RMySQL и RODBC обеспечивают именно это:

dbGetQuery, чтобы возвращать результаты запроса в кадре данных и dbWriteTable, чтобы вставлять данные в таблицу или выполнять массовое обновление (из фрейма данных).

Ответ 5

Рядом с различными пакетами драйверов для запросов к DB (DBI, RODBC, RJDBC, RMySql,...) и dplyr, там также sqldf https://cran.r-project.org/web/packages/sqldf/

Это автоматически импортирует данные в db и позволяет запрашивать данные через sql. В конце db удаляется.

Ответ 6

Как опытный пользователь R, я бы не использовал это. Во-первых, этот "виртуальный фрейм" будет использоваться медленно, поскольку вам постоянно нужно синхронизировать между R-памятью и базой данных. Это также потребовало бы блокировки таблицы базы данных, поскольку в противном случае у вас есть непредсказуемые результаты из-за других изменений, происходящих одновременно.

Наконец, я не думаю, что R подходит для реализации другой оценки объектов promise. Выполнение myFrame$foo[ myFrame$foo > 40 ] по-прежнему будет получать полный столбец foo, поскольку невозможно реализовать полную схему перевода из R в SQL.

Поэтому я предпочитаю загружать dataframe() из запроса, использовать его и записывать обратно в базу данных, если это необходимо.