2010-10-28 39 views
5

Giả sử tôi có một chức năng đọc dữ liệu từ một bảng MySQL, thao tác nó và trả về một số data.frame. Lưu ý rằng chức năng chỉ là một ví dụ có chức năng không quan trọng ..., ví dụ:Làm thế nào để trả về một data.frame với một tên đã cho từ một hàm?

addRowSd <- function(table,con,pattern="^Variable") { 

dframe <- dbReadTable(con,table) 
cn <- colnames(dframe) 
qs <- subset(x, x %in% grep(pattern, x, value=TRUE)) 
dframe$qsd <- sd(t(dframe[,c(qs)])) 

return(dframe) 
} 

mydf$sd <- addRowSd(...) 

Tôi kết thúc với một data.frame được gọi là mydf. Bây giờ tôi muốn làm điều này với một vector ký tự của các tên bảng SQL và đặt tên cho các khung dữ liệu trả về tương ứng. Nếu tôi chỉ sử dụng

x=lapply(MySQLtablenames,addRowSd,con) 

Tôi sẽ nhận được một số danh sách được gọi là x. Tất nhiên tôi có thể không công bố và đổi tên tất cả mọi thứ theo cách tôi muốn, nhưng câu hỏi của tôi là:

Làm thế nào tôi có thể thực hiện (hoặc một hàm khác có thể so sánh) trả về nhiều datafram đơn hoặc ít nhất một danh sách chứa một số tên từ vector nhân vật của tôi "MySQLtablenames"?

+0

có thể nó có thể giúp làm cho các chức năng addRowSd gán một số tên để data.frame trở ... –

+1

thế nào về 'tên (x) <- MySQLtablenames' hoặc trong một dòng' x <-setNames (lapply (MySQ) Ltablenames, addRowSd, con), MySQLtablenames) 'hoặc' x <-lapply (setNames (MySQLtablenames, MySQLtablenames), addRowSd, con) ' – Marek

Trả lời

9

chỉ tìm thấy một câu trả lời trên của riêng tôi:

assign("somename",dframe,envir = .GlobalEnv) 
+0

Bạn có thể gặp vấn đề về phạm vi với điều này. Ví dụ: nếu bạn muốn sử dụng hàm bên trong một hàm khác, thì tệp data.frame của bạn được tạo trong môi trường toàn cục. Bạn có thể chơi với 'parent.frame' để cải thiện phương thức của bạn. – Marek

+2

Trong cả hai ví dụ của bạn, bạn đang chèn một DF vào một danh sách (hoặc 'lapply' trả về một danh sách). Trong những trường hợp đó, tên của đối tượng là DF không liên quan, có phải không. Vấn đề là 'tên' cho các thành phần danh sách. Nếu tôi đã làm điều này, tôi sẽ lưu trữ các DF trong một danh sách, đặt tên trong danh sách sau tên bảng, theo nhận xét của Marek ở trên, và sau đó làm việc với danh sách. Nếu bạn muốn tham chiếu đến các cá thể DF theo tên, sử dụng 'with (x, DF.name)' trong đó 'x' là danh sách được trả về bởi' lapply' và 'DF.name' là tên của DF bạn muốn truy cập hoặc một số chức năng áp dụng cho nó. –

+0

@Marek, hiện tại điều duy nhất chạy vào vấn đề phạm vi là bộ não của tôi. các công cụ parent.frame là tất cả mới đối với tôi và tôi chưa hiểu, nhưng thx để trỏ đến nó. Điều gì sẽ gây ra các vấn đề phạm vi? Đang tải nhiều dữ liệu từ cơ sở dữ liệu đến cùng một môi trường (chung)? –

1

Nếu bạn cung cấp sapply một vector nhân vật, nó sẽ đặt tên cho các mục trong danh sách được trả về bởi các vector nhân vật cung cấp (USE.NAMES mặc định là TRUE). .. tôi cũng sẽ sử dụng đơn giản hóa = FALSE như tùy thuộc vào data.frames trở bạn có thể nhận được kết quả không thể đoán trước

Các vấn đề liên quan