Использование sqldf и RPostgreSQL вместе

При использовании RPostgreSQL я обнаруживаю, что я не могу использовать sqldf таким же образом. Например, если я загружаю библиотеку и считываю данные в кадр данных, используя следующий код:

library(RPostgreSQL)
drv <- dbDriver("PostgreSQL")
con <- dbConnect(drv, host="localhost", user="postgres", password="xxx", dbname="yyy", port="5436")
rs <- dbSendQuery(con, "select * from table");                           
df<- fetch(rs, n = -1); dbClearResult(rs) 
dbDisconnect(con) 

Я знаю, что содержимое этой таблицы в dataframe df. Однако, если я хочу запустить команду SQL с помощью sqldf, я бы раньше сделал что-то вроде этого:

sqldf("SELECT * FROM df WHERE X > 10")

Это больше не работает, поскольку я получаю сообщение об ошибке:

Error in postgresqlNewConnection(drv, ...) : 
  RS-DBI driver: (could not connect [email protected] on dbname "test"
)
Error in !dbPreExists : invalid argument type

Я предполагаю, что это ошибка оператора с моей стороны, но я не могу понять, какие аргументы поставлять в sqldf, чтобы он просто фокусировался на кадре данных и не пытался подключиться ни к чему другому.

Ответы

Ответ 1

Использование sqldf с RPostgreSQL

sqldf автоматически работает с test базой данных в PostgreSQL, если видит, что RPostgreSQL загружен. Таким образом, вы можете создать test базу данных в PostgreSQL, а затем использовать sqldf с этим

или вы можете указать имя другой базы данных.

Смотрите: sqldf FAQ 12

Использование sqldf с RSQLite

Если вы хотите использовать sqldf с RSQLite, а не с RPostgreSQL, вы можете использовать аргумент sqldf drv чтобы заставить его использовать драйвер не по умолчанию. например

sqldf("select foo from bar...",drv="SQLite")

или вы можете установить драйвер глобально, используя "sqldf.driver". Изнутри R:

options(sqldf.driver = "SQLite")

или другой возможностью, если вы хотите использовать RSQLite, является detach RPostgreSQL перед использованием sqldf и последующая его загрузка.

Смотрите ?sqldf для деталей.

Ответ 2

У меня была такая же ошибка, и я отделил пакет RPostgeSQL, перезапустил свой код sqldf, и он отлично работал r detach("package:RPostgreSQL", unload=TRUE)