将for循环替换为apply调用返回的列表列表,而不是单个对象

将for循环替换为apply调用返回的列表列表,而不是单个对象,r,lapply,R,Lapply,需要从特定的数据库表中获取列名,并在下一步中分配给要填充新数据的对象 (使用postgresql,但您可以使用您喜欢的RBDM。问题不是数据库,而是正确使用Lappy) 这是一个完美的工作代码: get_colNames_object <- function(x) { sqltext <- paste0("dbGetQuery(poscon, \"SELECT column_name FROM information_schema.columns WHERE

需要从特定的数据库表中获取列名,并在下一步中分配给要填充新数据的对象

(使用postgresql,但您可以使用您喜欢的RBDM。问题不是数据库,而是正确使用Lappy)

这是一个完美的工作代码:

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()) 
          }
但是…调用Lappy时,我得到的是列表列表,而不是单个对象:

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

lapply(tablelist, get_colNames_object)

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

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

tablelist我建议用一个简单的循环代替lappy。
这个代码对我有用:

for (t in tablelist) {

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

  eval(parse(text = text_to_parse))


}
for(表列表中的t){

text-to-parse我建议使用一个简单的循环,而不是lappy。 这个代码对我有用:

for (t in tablelist) {

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

  eval(parse(text = text_to_parse))


}
for(表列表中的t){

text_to_parse在
DBI
中有一个函数
dbListFields
,可以让您直接查询表的列名。我从
dbListFields
帮助页面扩展了这个示例,以了解您关于使用
lappy

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))

DBI
中有一个函数
dbListFields
,可以让您直接查询表的列名。我从
dbListFields
帮助页面扩展了该示例,以了解有关使用
lappy

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))

Cath如果调用get_colNames_object(“客户”)然后get_colNames_object(“销售”),则环境中会有两个对象。每个对象都是分配给对象的列名列表,上面有表名。每个表的预期输出都是一个对象。切勿使用
eval(parse(…)
像这样。并且不要编写有副作用的函数。如果您进行此调用,请获取\u colNames\u对象(“客户”),然后获取\u colNames\u对象(“销售”)环境中有两个对象。每个对象都是分配给对象的列名列表,上面有表名。每个表的预期输出都是一个对象。不要像这样使用
eval(parse(…)
。也不要编写有副作用的函数。