4

我正在尝试使用 R 中的 sqldf 库重写一些代码,这应该允许我在数据帧上运行 SQL 查询,但是我遇到的问题是,每当我尝试运行查询时,R 似乎都在尝试查询我使用的实际真正的 MySQL db con 并通过我试图搜索的数据框的名称查找表。

当我运行这个:

    sqldf("SELECT COUNT(*) from work.class_scores")

我得到:

mysqlNewConnection(drv, ...) 中的错误:RS-DBI 驱动程序:(无法连接到数据库:错误:无法通过套接字 '/tmp/mysql.sock' (2) 连接到本地 MySQL 服务器)

当我尝试使用两种不同的方式指定位置时(第一种形式是 googlecode 页面,第二种方式应该根据文档正确)

>     sqldf("SELECT COUNT(*) from work.class_scores", sqldf.driver = "SQLite")
Error in sqldf("SELECT COUNT(*) from work.class_scores", sqldf.driver = "SQLite") : 
  unused argument(s) (sqldf.driver = "SQLite")
>     sqldf("SELECT COUNT(*) from work.class_scores", drv = "SQLite")
Loading required package: tcltk
Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared library '/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so':
  dlopen(/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
  Referenced from: /Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so
  Reason: image not found
Error: require(tcltk) is not TRUE

所以,我认为这个包 tcltk 可能有问题,我从未听说过,所以我尝试解决这个问题并找到一些问题:

 > install.packages("tcltk")
Warning in install.packages :
  argument 'lib' is missing: using '/Users/michaeldiscenza/Library/R/2.11/library'
Warning in install.packages :
  package ‘tcltk’ is not available
> install.packages("tcltk2", lib="/Applications/RStudio.app/Contents/Resources/R/library")
trying URL 'http://lib.stat.cmu.edu/R/CRAN/bin/macosx/leopard/contrib/2.11/tcltk2_1.1-5.tgz'
Content type 'application/x-gzip' length 940835 bytes (918 Kb)
opened URL
==================================================
downloaded 918 Kb


The downloaded packages are in
    /var/folders/Y1/Y1gdz9tKFiSnWsGP9+BDcU+++TI/-Tmp-//RtmpL07KTL/downloaded_packages
> library("tcltk")
Loading Tcl/Tk interface ... Error : .onLoad failed in loadNamespace() for 'tcltk', details:
  call: dyn.load(file, DLLpath = DLLpath, ...)
  error: unable to load shared library '/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so':
  dlopen(/Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so, 10): Library not loaded: /usr/local/lib/libtcl8.5.dylib
  Referenced from: /Library/Frameworks/R.framework/Resources/library/tcltk/libs/x86_64/tcltk.so
  Reason: image not found
Error: package/namespace load failed for 'tcltk'

!dbPreExists 中的错误:参数类型无效

在这里,我真的不知道问题是什么,我需要移动一些东西吗?

我尝试的另一种方法是在对数据框对象运行查询之前,设置我的数据库连接,以便 R 会在那里查看,而不是尝试连接到实际的本地 MySQL 数据库。但这没有用。回到套接字的问题(即使我可以毫无问题地查询本地数据库本身。

>     con <- sqldf()
Error in mysqlNewConnection(drv, ...) : 
  RS-DBI driver: (Failed to connect to database: Error: Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2)
)

最终,我想查询例如 C 的值大于 2 的记录数,我觉得这样做很舒服。唯一的问题是我不知道是否有另一种方法可以指定我正在查询的是数据框而不是实际的数据库。我在这里错过了一些非常愚蠢和容易的东西吗?

谢谢!

4

2 回答 2

11

这个答案是从我之前的评论中转移过来的。

该帖子和评论表明:

  1. 即使已加载 RMySQL,也希望将 SQLite 与 sqldf 一起使用

  2. 有一条关于 tcltk 丢失的消息

  3. 有一个问题:数据框sqldf("select count(*) from work.class_scores") 在哪里。work.class_scores

sqldf 主页FAQ #7 地址 (1) 和 FAQ #5 地址 (2)。(3) 是由于 dot 是 SQL 运算符,因此需要引用此类数据框名称,否则更改其名称以删除点。

下面我们提供实现上述三种解决方案的可重现示例。

sqldf.driver选项用于强制使用 SQLite,即使已加载 RMySQL。

关于 tcltk,有三种方法: (i) 该gsubfn.engine选项导致使用 R 代码代替 tcltk,这样就不需要 tcltk 包。请参阅下面的示例代码。(ii) 交替安装 tcltk。(iii) 当 sqldf 0.4-4 是当前版本时,有人问过这个问题,但现在 sqldf 0.4-5 已经出局,请注意已添加了额外的 tcltk 包检测,这使得它更有可能在没有用户的情况下自动处理所有这些设置任何选项,而无需安装 tcltk。因此,最简单的解决方案可能只是升级到 sqldf 0.4-5 或更高版本。

我们引用包含点的数据框名称或将数据框名称替换为不包含点的名称:

options(sqldf.driver = "SQLite") # as per FAQ #7 force SQLite
options(gsubfn.engine = "R") # as per FAQ #5 use R code rather than tcltk

library(RMySQL)
library(sqldf)

work.class_scores <- BOD # BOD is built in
sqldf("select count(*) from 'work.class_scores'")

# or
work_class_scores <- work.class_scores
sqldf("select count(*) from work_class_scores")

编辑:

添加了有关 sqldf 0.4-5 的信息。

于 2011-11-22T04:01:48.873 回答
3

您可以尝试从此处tcl安装软件包吗?(这是假设您在 Mac 上)。

于 2011-11-22T02:52:15.910 回答