在R中循环通过dbexecute命令时出错

k2arahey  于 2023-04-03  发布在  其他
关注(0)|答案(1)|浏览(123)

我试图在r中循环dbtool命令,同时处理我的模式文件,逐个删除元素,并将它们存储在每个元素的单独文件中。

library("RSQLite")
 sqlite <- dbDriver("SQLite")
 dbname <- "models_signif.db" 
 db = dbConnect(sqlite,dbname)
 brain_n <- dbGetQuery(db,"SELECT * FROM weights")
 x <- which(brain_n$gene %in% "ENSG00000130943.6")
 rsid_list <- brain_n$rsid[x]
 ##now loop for generating the files
 for( i in 1:128){
   #copy original file db to another
   #use that for modifications: 
   library("RSQLite")
   sqlite <- dbDriver("SQLite")
   dbname <- "models_signif.db" 
   db = dbConnect(sqlite,dbname)
   #brain_cortex_gtex_n <- dbGetQuery(db,"SELECT * FROM weights")
   require("RSQLite")
   sqlite <- dbDriver("SQLite")
   myfile <- paste0("modelsn","_",i,".db")
   dbname1 <- myfile
   db1 = dbConnect(sqlite,dbname1)
   sqliteCopyDatabase(db, db1)
   dbDisconnect(db)
   #gtex_n_1 <- dbGetQuery(db1,"SELECT * FROM weights") ##dim 9453
   ##now filter row1098 its beta is 0.002 and rsid is rs4560235
   #dbGetQuery(db,"SELECT * FROM weights") ##dim 5415rows
   rsid <- rsid_list[i]
   dbExecute(db1,"DELETE FROM weights WHERE rsid=rsid_list[i] ") 
   dbDisconnect(db1)
 }

Error: 
Error: near "[i]": syntax error
k97glaaz

k97glaaz1#

rdis_list[i]是R代码,而不是SQL代码。SQLite引擎(或任何DBMS引擎)不会以相同的方式解释它。由于它是R中的字符串,R解析器不会尝试推断它应该被替换为其他内容。
快速/草率(而不是最佳实践)的方法是将其paste到查询中。同样,不是推荐的方法

dbExecute(db1,paste("DELETE FROM weights WHERE rsid=",
                       dbQuoteLiteral(db1, rsid_list[i])))

更好的方法是使用“参数绑定”,有几个原因。在查询中的每个地方使用?,并将params=list(..)添加到查询/语句中。

dbExecute(db1,"DELETE FROM weights WHERE rsid=?",
              params = list(rsid_list[i]))

参见参数化查询了解更多关于使用绑定参数的细节。
一些旁注:
1.你在循环外定义了sqlitedbnamedb,在循环中的每一次传递中重新创建这些变量是浪费的、不必要的,而且一点帮助都没有。这些变量可以从for内部访问,使用它们。
1.不要在这里使用require,原因有两个:首先,您已经加载了library("RSQLite"),因此包函数在您的环境中已经可用,所以执行require除了浪费资源之外什么也做不了(微)时间。第二,只使用require(.)(用于任何用途)如果您认为包可能不可用,则捕获其返回值,并对其结果做出不同的React。有关相关函数的详细信息,请访问https://r-pkgs.org/namespace.html#search-path。

相关问题