2017-02-13 4 views
0

Необходимо получить имена столбцов из конкретной таблицы базы данных и назначить объектам, которые будут заполнены новыми данными на следующем шаге.заменяя цикл, применяя вызов, возвращенный список списков вместо отдельных объектов.

(. С использованием PostgreSQL, но вы можете использовать год-RBDMS предпочитают вопрос не базы данных, но правильное использование lapply)

Это прекрасно работает код:

get_colNames_object <- function(x) { 

      sqltext <- paste0("dbGetQuery(poscon, \"SELECT column_name FROM information_schema.columns WHERE table_name=\'", x,"\' AND table_schema=\'my_schema\'\")") 

      result <- eval(parse(text = sqltext)) 

      result <- unname(result$column_name) 

      assign(x, result, envir = parent.frame()) 
      } 

это похоже на работу, если вам сделать вызов функции с одной таблицей. Объект возвращается в порядке таким образом:

 get_colNames_object("customers") 

> customers 

    [1] "id"     "client_id"   "name"   "surname" 

Но ..... при вызове lapply я получаю список списков вместо отдельных объектов:

tablelist <- c("customers", "sales") 

lapply(tablelist, get_colNames_object) 

[[1]] 
[1] "id"     "client_id"   "name"   "surname"    

[[2]] 
[1] "id"     "product_id"   "price"  "client_id"  

любой намек, почему это не работает с мой список? Ожидаемый результат - это куча объектов, относящихся к именам столбцов. Один для каждой таблицы в схеме.

+0

Cath если вы сделаете этот призыв get_colNames_object («клиенты»), а затем get_colNames_object («продажа») вы получаете два объекта в среде. Каждый объект представляет собой список имен столбцов, назначенных объекту с именем таблицы на нем. Ожидаемый результат - это объект для каждой таблицы. – Forge

+3

Никогда не используйте 'eval (parse (...))' как это. И не записывайте функции с побочными эффектами. – Roland

ответ

1

Я предлагаю простой цикл вместо lapply. Этот код работает для меня:

for (t in tablelist) { 

    text_to_parse <- paste0(t ," <- get_colNames_object(\'",t,"\')") 

    eval(parse(text = text_to_parse)) 


} 
1

Существует функция dbListFields в DBI, что позволяет запрашивать имена столбцов Ot таблицы непосредственно. Я продлила пример со страницы dbListFields справки для вопроса об использовании lapply

library(DBI) 
library(RSQLite) 

con <- dbConnect(RSQLite::SQLite(), ":memory:") 

dbWriteTable(con, "mtcars", mtcars) 
dbWriteTable(con, "mtcars2", mtcars) 

table_list <- list("mtcars", "mtcars2") 

t(sapply(table_list, dbListFields, conn = con)) 

Результат:

[,1]  [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11][,12] 
[1,] "row_names" "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb" 
[2,] "row_names" "mpg" "cyl" "disp" "hp" "drat" "wt" "qsec" "vs" "am" "gear" "carb"