R科研作图学习小组

http://group.keyangou.com/RGraph
组长: 管理员:
  • 访问次数:28535
  • 小组等级:9
  • 话题:593
  • 回答:39
  • 签到:439
  • 小组排名:
  • R2-006 第二次作业

    dean 发布于:2018.02.12

    part1

    library(RMySQL)

    help(package="RMySQL") #查看RMySQL的说明文档,里面有RMySQL所有可用的方法  

    #创建数据库连接 ,localhost代表本机,dbname就是上面创建的Rdatabase,用户名一般是root

    # password为空(如果你没设置的话一般都是这样的)

    con <- dbConnect(MySQL(),host="localhost",dbname="Rdatabase",user="root",password="")

    dbSendQuery(con,'SET NAMES utf8')

    #获取连接信息,查看database下所有表

    #summary(con)  

    #dbGetInfo(con)  

    #dbListTables(con)  

    #dbRemoveTable(con,"test")


    #数据库连接删除函数,每个任务之前最好先清理所有的连接,调用此函数就可以

    killDbConnections <- function () {

      all_cons <- dbListConnections(MySQL())

      print(all_cons)

      for(con in all_cons)

        +  dbDisconnect(con)

      print(paste(length(all_cons), " connections killed."))

    }

    1.png


    part2


    library(DBI)


    library(RMySQL)


    con <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")


    dbSendQuery(con,'SET NAMES utf8')


    library(httr)


    totalNum=562


    pageSize=10


    totalPage=ceiling(totalNum/pageSize) 

    print(totalPage)


    currentPage=1


    term='(cell[TA]) AND 2017[DP]'


    usehistory='Y'


    querykey=''


    webenv=''


    postSearchUrl='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/esearch.fcgi'


    while(currentPage<=totalPage){

      

      retstart=(currentPage-1)*pageSize

      

      r <- POST(postSearchUrl, 

                

                body = list(

                  

                  db='pubmed',

                  

                  term=term,

                  

                  retmode='json',

                  

                  retstart=retstart,

                  

                  retmax=pageSize,

                  

                  usehistory=usehistory,

                  

                  rettype='uilist'

                  

                )

                

      )

      

      stop_for_status(r)

      

      data=content(r, "parsed", "application/json")

      

      esearchresult=data$esearchresult

      

      querykey=esearchresult$querykey

      

      webenv=esearchresult$webenv

      

      idlist =esearchresult$idlist

      

      n = length(idlist)

      

      pmid=c()

      

      i = 1

      

      while(i<=n){

        

        pmid=c(pmid, as.character(idlist[i][1]))

        

        i = i+1

        

      }

      

      article=data.frame('pmid'=pmid)

      

      dbWriteTable(con,"article",article,append=TRUE)

      

      currentPage = currentPage + 1

      

    }


    dbDisconnect(con)

    2.png



    part3


    library(RMySQL)

    library(xml2)

    library(httr)

    killDbConnections()

    con <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")

    dbSendQuery(con,'SET NAMES utf8')

    rs <- dbSendQuery(con, "SELECT * FROM article WHERE isdone=0")

    while (!dbHasCompleted(rs)) {

      chunk <- dbFetch(rs, 10)

      pmidStr=""

      i=1

      n=nrow(chunk) #获得总行数

      while (i<=n){

        pmidStr = paste(pmidStr,chunk[i,3],sep=",") #循环将各个pmid之间用逗号连接起来

        i = i + 1

      }

      pmidStr=substr(pmidStr,2,100000) #去掉pmid第一个逗号,从第2位起,到100000位,即到末尾

      #下面就是第一次作业里面获取title和abstract

      postFetchUrl='https://eutils.ncbi.nlm.nih.gov/entrez/eutils/efetch.fcgi'

      r2 <- POST(postFetchUrl, 

                 body = list(

                   db='pubmed',

                   id=pmidStr,

                   retmode='xml'

                 )

      )

      stop_for_status(r2) #clear http status

      data2=content(r2, "parsed", "application/xml")

      article=xml_children(data2)

      #xml_length(article)为里面文章的数量

      count=length(article)

      cnt=1

      while(cnt<=count){

        title=xml_text(xml_find_first(article[cnt],".//ArticleTitle")) #找到第一个ArticleTitle节点

        abstract=xml_text(xml_find_first(article[cnt],".//AbstractText"))

        pmid=xml_text(xml_find_first(article[cnt],".//PMID"))

        #更新数据库,首先去掉title和abstract里面的单引号,单引号会导致mysql更新出现问题

        title = gsub("'","",title)

        abstract = gsub("'","",abstract)#得到新的title和abstract(没有单引号)

        #构建mysql更新语句,R语言的字符串拼接不太好,不能使用"+",也不能使用点"."

        sql=paste("UPDATE article SET title='",title,"',abstract='",abstract,"',isdone=1"," where pmid='",pmid,"'",sep="")#设置isdone字段用于标记已经处理完的

        #执行,并新开通一个mysql连接

        con2 <- dbConnect(MySQL(),host="localhost",dbname="rdb",user="root",password="")

        dbSendQuery(con2,'SET NAMES utf8')

        dbSendQuery(con2,sql)

        dbDisconnect(con2)

        cnt = cnt + 1#延迟1秒运行,因为pubmed接口说明如果1秒内并发超过3次将会被封禁IP

        Sys.sleep(1)

      }

    }

    3.png

    第三题出错~查找百度说是定义的字符串类型问题~但是大家别人的没错呀?求教……

     
    1条评论 217浏览 邀请回答

    木萱小主 回答于:2018年03月07日 09:00:351楼

    北京 北京协和医学院 微生物与生化药学博士 

    小组告示

    科研狗 2012-2016 京ICP备16006621 科研好助手,专业的科研社交共享平台