我正在尝试在 r 中循环执行 dbexceute 命令,同时处理我的模式文件以逐个删除元素并将它们存储在每个元素的单独文件中。但是在运行循环时,我在 R 中遇到错误。
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
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]))
有关使用这样的绑定参数的更多详细信息,请参阅参数化查询。
一些旁注:
您在循环外定义
sqlite
、dbname
和db
,这是浪费的、不必要的,并且根本没有帮助在每次循环中重新创建这些变量。可以从for
中访问变量,使用它们。
不要在那里使用
require
,有两个原因。首先,您已经加载了 library("RSQLite")
,因此包函数在您的环境中已经可用,所以执行 require
绝对是在浪费(微)时间。其次,只有在您认为包可能不可用时才使用require(.)
(用于任何用途),您捕获它的返回值,并对它的结果做出不同的反应。参见https://stackoverflow.com/a/51263513/3358272,https://yihui.org/en/2014/07/library-vs-require/,相关函数详情,https ://r-pkgs.org/namespace.html#search-path.