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

时间:2016-05-18 14:08:23

标签: r monetdb

我正在尝试在数据库中运行一些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")

非常感谢有关如何解决此问题的提示。

至于datachache应该在这里做什么,这是我调试工作的一部分。该代码是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 =   “关闭”,:'。

然后我再次尝试并得到了这个错误:

  

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 :(得分: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