Пакет sqldf в R, запрашивающий фрейм данных

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

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

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

Спасибо!


person Michael Discenza    schedule 21.11.2011    source источник
comment
Хорошо, спасибо. Моя проблема в последнем, я считаю. Я использую RMySQL в сценарии. Я зашел на страницу googlecode и посмотрел FAQ # 7, я не уверен, что они указали правильный вариант для предоставления, потому что это просто дает мне ошибку. Основываясь на документации пакета sqldf, я думаю, что мне нужно установить drv=SQLite, но я получаю множество других ошибок. Я обновляю вопрос с некоторыми кодами и ошибками прямо сейчас.   -  person Michael Discenza    schedule 22.11.2011
comment
ок, попробую переименовать. Я имею в виду именно то, что эта команда не сработала: sqldf(SELECT COUNT() from work.class_scores, sqldf.driver = SQLite). Я получаю сообщение об ошибке: Ошибка в sqldf(SELECT COUNT() from work.class_scores, sqldf.driver = SQLite): неиспользуемый аргумент(ы) (sqldf.driver = SQLite Когда я пробую это с немного другим аргументом: sqldf(SELECT COUNT(*) from work.class_scores, drv = SQLite , он работает, но не может выполнить запрос из-за проблемы с tcltk, который я сейчас пытаюсь переустановить.   -  person Michael Discenza    schedule 22.11.2011
comment
О, ничего себе, эта штука со сменой имени сделала свое дело. Большое спасибо!!   -  person Michael Discenza    schedule 22.11.2011
comment
Я получаю сообщения, чтобы избежать расширенных обсуждений в комментариях, поэтому я собираюсь удалить свои комментарии и перенести их в ответ. Смотрите этот ответ для получения дополнительной информации.   -  person G. Grothendieck    schedule 22.11.2011


Ответы (2)


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

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

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

  2. было сообщение об отсутствии tcltk

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

На главной странице sqldf адреса часто задаваемых вопросов № 7 (1) выше и адреса часто задаваемых вопросов № 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")

РЕДАКТИРОВАТЬ:

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

person G. Grothendieck    schedule 22.11.2011

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

person djq    schedule 22.11.2011
comment
Да, я сделал это, и это решило проблемы, которые у меня были с tcltk. - person Michael Discenza; 22.11.2011
comment
Я установил tcltk2 из CRAN, затем загрузил sqldf. Ошибка ушла. Надеюсь, это поможет. - person Mike S.; 15.08.2015