在Ubuntu 12.04 x64上使用R 3.0的dbConnect - as.integer(from)中的错误:无法将类型'S4'强制转换为'integer'类型的向量

时间:2013-05-06 16:58:12

标签: r

刚刚更新到R 3.0并更新了所有软件包,包括DBI。令我惊讶的是,我经常使用的脚本停止工作。

我无法使用dbConnect连接到MySQL数据库。代码脚本立即,所以只有几行会重现问题

> require("RMySQL")
> m = dbDriver("MySQL")
> dbConnect(m, user = 'user', password = 'pass', dbname = 'dbname', host = 'localhost', client.flag = CLIENT_MULTI_STATEMENTS)

Error in as.integer(from) : 
cannot coerce type 'S4' to vector of type 'integer'
Calls: dbConnect ... mysqlNewConnection -> isIdCurrent -> as -> asMethod

也尝试过:

  

dbConnect(MySQL(),user ='user',password ='pass',dbname ='dbname',host ='localhost',client.flag = CLIENT_MULTI_STATEMENTS)

但同样的问题

还尝试删除其他参数,但同样的问题来自dbDriver。

最新更新的DBI包中有哪些变化?我该如何解决这个问题?

我注意到DBI包是孤立的,所以不知道该问谁。

2 个答案:

答案 0 :(得分:1)

我在ubuntu上遇到了与R 3.0.1相同的问题。

安装最新版本的RMySQL-package解决了这个问题:

> install.pacakges("RMySQL")

确保在安装后重新启动R.

答案 1 :(得分:1)

我还在深入研究这个问题,但我想我已经确定了这个问题的多种原因。在它们的根源上,它们都与R期望一个S4对象有关,而是取回一个整数。我相信这些通常是连接无法建立的结果。

为什么失败?我注意到的一件事是,如果你未能接近许多连接(~16 [见驱动程序句柄调用中指定的最大连接数]打开)DBI将不会/无法打开新连接。确保您根据需要致电dbDisconnect。通常,这种问题会产生合理的错误消息,但有时会导致上述错误。如果可能的话,通过抽象层访问DB,例如, dplyr因为有些人将监视数据库连接并在它们处于非活动状态时终止它们。而AFIK如果在函数中打开连接并且函数中断,则除非从初始调用dbConnect返回驱动程序对象,否则无法关闭打开的连接。在这种情况下,您别无选择,只能重新启动R的实例(可能还要重置机器并清理工作区)。

我最近遇到的另一个问题是,如果RMySQL屏蔽RPostgreSQL,那么RPostgreSQL将失败。反过来似乎并非如此,但是因为其他人在这里提到RPostgreSQL显示相同的错误信息,所以它似乎值得注意。

<强>更新

最新版本的RMySQL(0.10.1)似乎已经完成了RPostgreSQL - 无论加载顺序如何,RPostgreSQL现在都无法工作。在RMySQL上工作的人似乎正在研究RPostgres(https://github.com/rstats-db/RPostgres),如果使用该软件包而不是RPostgreSQL,这种冲突似乎没有问题。具体而言,在dbConnect中指定驱动程序时,在RPostgres::Postgres()的位置使用RPostgreSQL::PostgreSQL()。其他包装,例如dplyr,目前假设RPostgreSQL,所以这个问题仍然可以咬人(但似乎解决方案正在进行中(https://github.com/rstats-db/RMySQL/issues/28)。