2012-08-16 10 views
15

(Theo ánh xạ đối tượng-quan hệ, tôi có nghĩa là những gì được mô tả ở đây: Wikipedia: Object-relational mapping.)Có một gói cho ánh xạ đối tượng-quan hệ trong R không?

Đây là cách tôi có thể tưởng tượng công việc này trong R: một loại "khung dữ liệu ảo" được liên kết với cơ sở dữ liệu. kết quả của truy vấn SQL khi được truy cập. Ví dụ: head(virtual_list) thực sự sẽ trả lại kết quả của (select * from mapped_table limit 5) trên cơ sở dữ liệu được ánh xạ.

Tôi đã tìm thấy điều này post by John Myles White, nhưng có vẻ như không có tiến triển nào trong 3 năm qua.

Có gói nào hoạt động không?

Nếu không,

  1. Nó sẽ có ích?
  2. Cách tốt nhất để thực hiện nó (S4?) Là gì?
+0

Oracle có sản phẩm thực hiện điều này trong R ... –

Trả lời

10

Gói gần đây dplyr đang triển khai (trong số các tính năng tuyệt vời khác).

Dưới đây là hình ảnh minh họa từ các ví dụ về các chức năng 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

Có vẻ như John Myles White đã từ bỏ nó.

Có một số cách giải quyết được giải thích here.

7

Có một gói không được hỗ trợ cũ, SQLiteDF, thực hiện điều đó. Xây dựng nó từ nguồn và bỏ qua nhiều thông báo lỗi.

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

Tôi không nghĩ nó sẽ hữu ích. R không phải là một ngôn ngữ OOP thực sự. Cấu trúc dữ liệu "trung tâm" trong R là khung dữ liệu. Không cần Object-Relational Mapping here.What bạn muốn là một ánh xạ giữa bảng SQL và khung dữ liệu và RMySQL và RODBC cung cấp chỉ là:

dbGetQuery để trả lại kết quả của một truy vấn trong một khung dữ liệu và dbWriteTable để chèn dữ liệu vào bảng hoặc thực hiện cập nhật hàng loạt (từ một khung dữ liệu).

+0

Địa chỉ lớp R6 không đủ tốt? – jangorecki

+0

Tôi không đồng ý với quan điểm này: không có ngôn ngữ hữu ích nào là "thuần túy" của bất kỳ loại cụ thể nào. R tuyên bố là một ngôn ngữ chức năng, nhưng nó cũng cho phép nhiều tác dụng phụ. R nên có phương tiện để tạo ra một ORM, và tôi vui mừng rằng 'dplyr' bước lên. –

0

Là người dùng R có kinh nghiệm, tôi sẽ không sử dụng tính năng này. Trước hết, 'khung ảo' này sẽ chậm sử dụng, vì bạn liên tục cần phải đồng bộ hóa giữa bộ nhớ R và cơ sở dữ liệu. Nó cũng sẽ yêu cầu khóa bảng cơ sở dữ liệu, vì nếu không bạn có kết quả không thể đoán trước do các chỉnh sửa khác xảy ra cùng một lúc.

Cuối cùng, tôi không nghĩ R phù hợp để triển khai đánh giá khác nhau đối tượng promise. Làm myFrame$foo[ myFrame$foo > 40 ] sẽ vẫn tìm nạp đầy đủ cột foo vì bạn không thể triển khai một bản dịch đầy đủ từ R sang SQL.

Vì vậy, tôi muốn tải một khung dữ liệu() từ truy vấn, sử dụng nó và ghi nó trở lại cơ sở dữ liệu nếu được yêu cầu.

+0

Cảm ơn câu trả lời của bạn. Tôi đồng ý với bộ nhớ và khóa. Đó có thể là một vấn đề tùy thuộc vào dự án. Về ví dụ về lựa chọn dòng: một bản dịch đầy đủ có thể không thực hiện được, nhưng ít nhất có nhiều thao tác thông thường nên khả thi (ví dụ, lựa chọn dòng trong ví dụ sẽ không quan trọng) ... – nassimhddd

+0

Ví dụ lựa chọn dòng là tầm thường cho bạn. Hãy đẩy mạnh hơn nữa: top 10% phần trăm? Ngẫu nhiên n = 100 lấy mẫu? vv ... Trong thực tế, các giới hạn này rất nhanh chóng đạt được. – parasietje

1

Next để các gói điều khiển khác nhau để truy vấn DBS (DBI, RODBC, RJDBC, RMySql, ...) và dplyr, cũng có sqldf https://cran.r-project.org/web/packages/sqldf/

Điều này sẽ tự động nhập các khung dữ liệu vào db & cho phép bạn truy vấn dữ liệu qua sql. Vào cuối db sẽ bị xóa.