首页 文章

MonetDB连接到在数据库中运行的R代码中的GO.db

提问于
浏览
0

我试图在数据库中运行一些R代码 . 大部分都进展顺利,但我似乎偶然发现了一个错误 . 我无法加载以下包,这是我的一些代码的依赖项 . WGCNA

我一直在追逐它,这似乎是由于尝试加载GO.db时出错 .

我收到以下错误:

Error in .local(conn, statement, ...) : 
  Unable to execute statement 'SELECT * FROM tmp_test();'.
Server says '!Error running R expression. Error message: Error in as.data.frame((function() { : '.

进一步挖掘它似乎是由于以下声明:

dbconn <- dbFileConnect(dbfile)

错误可以使用:

functionDef <- paste(
"CREATE FUNCTION tmp_test() ",
"RETURNS TABLE(output STRING)",
"LANGUAGE R ",
"{", 
"library(AnnotationDbi)",
"datacache <- new.env(hash=TRUE, parent=emptyenv())",
"pkgname <- 'GO.db'",
"libname <- .libPaths()[1]",
"dbfile <- system.file('extdata', 'GO.sqlite', package=pkgname, lib.loc=libname)",
"assign('dbfile', dbfile, envir=datacache)",
"dbconn <- dbFileConnect(dbfile)",
"};", sep = "\n")

dbGetQuery(conn, functionDef)

dbGetQuery(conn, "SELECT * FROM tmp_test();")

顺便说一下,从MonetDB中安装GO.db就可以了 . 并且可以使用以下R代码完成:

source("https://bioconductor.org/biocLite.R")
biocLite("GO.db")

非常感谢有关如何解决这个问题的提示 .

至于datacache应该在这里做什么,这是我的调试工作的一部分 . 该代码是GO.db包中zzz.R的一部分 . 获得此错误的另一种方法是尝试加载GO.db包 .

我尝试了HannesMühleisen的代码,得到了以下结果:我首先重启了monetdbd .

dbGetQuery(conn,“SELECT * FROM tmp_test()”)QQ:'SELECT * FROM tmp_test()'.local中的错误(conn,statement,...):无法执行语句'SELECT * FROM tmp_test()' . 服务器说'!运行R表达式时出错 . 错误消息:dbConnect中的错误(SQLite(),dbname = dbfile,cache_size = 64000,synchronous =“off”,:' .

然后我再次尝试并得到此错误:

dbGetQuery(conn,“SELECT * FROM tmp_test()”)QQ:'SELECT * FROM tmp_test()'.local中的错误(conn,statement,...):无法执行语句'SELECT * FROM tmp_test()' . 服务器说'!运行R表达式时出错 . 错误消息:as.data.frame中的错误((function(){:' .

我重新启动monetdbd后,我可以重现这个循环 .

1 回答

  • 0

    我按照以下方式工作:首先,我简化了示例代码,删除了显然未使用的 datacache 并使用 system.file 而不是手动搜索文件名 . 其次,您的函数需要实际返回您在模式中定义的内容,在本例中为 STRING .

    functionDef <- "CREATE FUNCTION tmp_test() RETURNS TABLE(output STRING) LANGUAGE R {
      library(AnnotationDbi)
      dbfile <- system.file('extdata/GO.sqlite', package='GO.db')
      dbconn <- dbFileConnect(dbfile)
      return('Hello, World')
    }"
    

    假设安装了GO.db和AnnotationDbi包,这对我来说很好:

    > dbGetQuery(conn, "SELECT * FROM tmp_test()")
            output
    1 Hello, World
    

相关问题