Есть ли пакет для объектно-реляционного отображения в 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() из запроса, использовать его и записывать обратно в базу данных, если это необходимо.