【问题标题】:error with a function to retrieve data from a database从数据库中检索数据的函数出错
【发布时间】:2016-10-17 18:47:24
【问题描述】:

我正在尝试从 NCBI 网站获取 FASTA 文件,我使用以下功能

getncbiseq <- function(accession){
  dbs <- c()
  for (i in 1:numdbs){
    db <- dbs[i]
    choosebank(db)
    resquery <- try(query(".tmpquery", paste("AC=", accession)),silent = TRUE)
    if (!(inherits(resquery, "try-error"))){
      queryname <- "query2"
      thequery <- paste("AC=",accession,sep="")
      query(`queryname`,`thequery`)
      # see if a sequence was retrieved:
      seq <- getSequence(query2$req[[1]])
      closebank()
      return(seq)
    }
    closebank()
  }
  print(paste("ERROR: accession",accession,"was not found"))
}    

当我尝试检索序列时

mydata <- getncbiseq("NC_001477")

getSequence(query2$req[[1]]) 中的错误:找不到对象“query2”

还有更好的方法来缩短这些循环功能吗?

如果我使用

query('queryname','the query')
#or 
query("queryname","thequery")

我得到另一个错误

查询错误("queryname", "thequery") : 无效请求:"(^) 处的未知列表:\"(^)查询\""

【问题讨论】:

    标签: r bioinformatics ncbi


    【解决方案1】:

    感谢您的大力帮助。我被困在这一点上一整天。我终于在 Windows 10 下使用 R3.4.0(32bits) 得到了以下代码:-

    getncbiseq <- function(accession)
    {
    require("seqinr") # this function requires the SeqinR R package
    # first find which ACNUC database the accession is stored in:
    dbs <- c("genbank","refseq","refseqViruses","bacterial")
    numdbs <- length(dbs)
    for (i in 1:numdbs)
    {
    db <- dbs[i]
    choosebank(db)
    # check if the sequence is in ACNUC database 'db':
    resquery <- try(query(".tmpquery", paste("AC=", accession)), silent = TRUE)
    
    if (!(inherits(resquery, "try-error"))) {
      queryname <- "query2"
      thequery <- paste("AC=", accession, sep="")
      query2 <- query(queryname, thequery)
      # see if a sequence was retrieved:
      seq <- getSequence(query2$req[[1]])
      closebank()
      return(seq)
    }
    closebank()
    }
    print(paste("ERROR: accession",accession,"was not found"))
    }
    

    【讨论】:

    • 在 Ubuntu 16.04 上的 R v3.3.3 中为我工作。为我省去了很多麻烦,干杯!
    • 这在 Windows 7 上的 R v3.4.3 中对我有用。谢谢。
    【解决方案2】:

    我认为您打算将您对query() 的调用分配给一个名为query2 的变量,但您忘了这样做。试试这个:

    if (!(inherits(resquery, "try-error"))) {
      queryname <- "query2"
      thequery <- paste("AC=", accession, sep="")
      query2 <- query(queryname, thequery)
      # see if a sequence was retrieved:
      seq <- getSequence(query2$req[[1]])
      closebank()
      return(seq)
    }
    

    正如您所提到的,您的其余代码也有一些可能需要改进的怪癖和问题。

    更新:

    这是在dbs 向量上使用sapply 重构代码,而不是显式for 循环(后者通常被R 人不赞成):

    processdbs <- function(x, y) {
        choosebank(x)
        resquery <- try(query(".tmpquery", paste("AC=", y)), silent = TRUE)
        if (!(inherits(resquery, "try-error"))) {
          queryname <- "query2"
          thequery  <- paste("AC=", y, sep="")
          query2 <- query(queryname, thequery)
    
          # see if a sequence was retrieved:
          seq <- getSequence(query2$req[[1]])
          closebank()
          return(seq)
        }
        closebank()
    }
    
    getncbiseq <- function(accession) {
       dbs <- c("genbank","refseq","refseqViruses","bacterial")
       result <- sapply(dbs, processdbs, y=accession)
       closebank()
    
       print(paste("ERROR: accession",accession,"was not found"))
    }
    

    您可能需要做一些额外的工作来检查result 向量并确定是否在任何地方检索到序列。

    【讨论】:

    • 这是完美的蒂姆,它有效,你知道缩短循环的方法吗?如果没有,没问题我喜欢并接受了你的回答
    • 我不知道它是否可以缩短,但您可以在dbs 向量上使用apply() 函数,并完全消除显式循环。
    猜你喜欢
    • 1970-01-01
    • 2020-12-18
    • 1970-01-01
    • 1970-01-01
    • 2019-11-19
    • 1970-01-01
    相关资源
    最近更新 更多