我试图在处理模式文件时通过r中的dbeexecute命令循环逐个元素删除元素并将它们存储在每个元素的单独文件中。但是在运行循环时,我在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。