пакет sqldf в R, запрашивающий фрейм данных - PullRequest
4 голосов
/ 22 ноября 2011

Я пытаюсь переписать некоторый код, используя библиотеку sqldf в R, что должно позволить мне выполнять запросы SQL для фреймов данных, но у меня возникает проблема, заключающаяся в том, что всякий раз, когда я пытаюсь выполнить запрос, R кажется, что это пытается запросить фактическую реальную базу данных MySQL, которую я использую, и искать таблицу по имени фрейма данных, по которому я пытаюсь найти.

Когда я запускаю это:

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

Я получаю:

Ошибка в mysqlNewConnection (drv, ...): Драйвер RS-DBI: (Не удалось подключиться к базе данных: ошибка: невозможно подключиться к локальному серверу MySQL через сокет '/tmp/mysql.sock' (2) )

Когда я пытаюсь указать местоположение двумя разными способами (первый из них формирует страницу 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, и мне это удобно. Единственная проблема в том, что я не знаю, есть ли другой способ указать, что я запрашиваю фрейм данных, а не фактическую базу данных. Я скучаю по чему-то действительно глупому и легкому здесь?

Спасибо!

Ответы [ 2 ]

11 голосов
/ 22 ноября 2011

Этот ответ был перенесен из моих предыдущих комментариев.

В посте и комментариях указывается, что:

  1. желательно использовать SQLite с sqldf, даже если загружен RMySQL и

  2. появилось сообщение об отсутствии tcltk

  3. возникла проблема с: sqldf("select count(*) from work.class_scores") где work.class_scores - фрейм данных.

На домашней странице sqldf FAQ # 7 адреса (1) выше и FAQ # 5 адреса (2). (3) связано с тем фактом, что точка является оператором 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")

EDIT:

Добавлена ​​информация о sqldf 0.4-5.

3 голосов
/ 22 ноября 2011

Можете ли вы попробовать установить пакет tcl из здесь ?(это при условии, что вы находитесь на Mac).

...