Ответ 1
Это ошибка в dplyr. Он все еще там в нынешнем хозяине github. Как указывает @hadley, он попытался избежать таких вещей, как имена таблиц в dplyr, чтобы предотвратить эту проблему. Текущая проблема, с которой вы сталкиваетесь, возникает из-за отсутствия выхода из двух функций. Создание таблицы прекрасно работает при предоставлении имени таблицы без сохранения (и выполняется с помощью dplyr::db_create_table
). Однако вставка данных в таблицу выполняется с помощью DBI::dbWriteTable
, которая не поддерживает имена нечетных таблиц. Если имя таблицы предоставлено для этой функции, она не может найти ее в списке таблиц (первая ошибка, о которой вы сообщаете). Если он предоставлен с экранированным доступом, тогда SQL для выполнения вставки не является синтаксически действительным.
Вторая проблема возникает, когда таблица обновляется. Код для получения имен полей, на этот раз на самом деле в dplyr, снова не позволяет избежать имени таблицы, поскольку использует paste0
, а не build_sql
.
Я исправил обе ошибки в вилку dplyr. Я также добавил запрос на удаление @hadley и сделал заметку по проблеме https://github.com/hadley/dplyr/issues/926. Тем временем, если вы захотите, вы можете использовать devtools::install_github("NikNakk/dplyr", ref = "sqlite-escape")
, а затем вернуться к основной версии после ее исправления.
Кстати, правильный SQL-99 способ избежать имен таблиц (и других идентификаторов) в SQL с двойными кавычками (см. SQL-стандарт для удаления имен столбцов?), MS Access использует квадратные скобки, а MySQL по умолчанию - обратные. dplyr использует двойные кавычки по стандарту.
Наконец, предложение от @RichardScriven не будет работать повсеместно. Например, select
является вполне допустимым именем в R, но не является синтаксически допустимым именем таблицы в SQL. То же самое можно сказать и о других зарезервированных словах.