Типы объектов R DBI несовместимы с dplyr?

#r #database #dplyr

#r #База данных #dplyr

Вопрос:

Я пытался следовать приведенному ниже примеру кода отсюда

 library(dplyr)

    con <- DBI::dbConnect(RSQLite::SQLite(), filename = ":memory:")
    mtcars_db <- copy_to(con, mtcars)
    
    mtcars_db %>%
      filter(cyl > 2) %>%
      select(mpg:hp) %>%
      head(10) %>%
      show_query()
    
    DBI::dbDisconnect(con)
 

Вместо результатов на веб-сайте я получил следующую ошибку:

Ошибка в хранилище.mode (x) <- «double»: объект ‘list’ не может быть принудительно приведен к типу ‘double’ трассировки:

  1. mtcars_db %>% filter(cyl> 2) %>% select(mpg: hp) %>% head(10) %>% . show_query()
  2. С помощью Visible(eval(quote( _fseq ( _lhs )), env, env))
  3. eval(quote( _fseq ( _lhs )), env, env)
  4. eval(quote( _fseq ( _lhs )), env, env)
  5. _fseq ( _lhs )
  6. freduce(значение, _function_list )
  7. function_list[i]
  8. фильтр (., cyl> 2)

Объект DBI, похоже, загружен правильно и печатает :

 # Source:   table<mtcars> [?? x 11]
# Database: sqlite 3.30.1 []
     mpg   cyl  disp    hp  drat    wt  qsec    vs    am  gear  carb
   <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
 1  21       6  160    110  3.9   2.62  16.5     0     1     4     4
 2  21       6  160    110  3.9   2.88  17.0     0     1     4     4
 3  22.8     4  108     93  3.85  2.32  18.6     1     1     4     1
 4  21.4     6  258    110  3.08  3.22  19.4     1     0     3     1
 5  18.7     8  360    175  3.15  3.44  17.0     0     0     3     2
 6  18.1     6  225    105  2.76  3.46  20.2     1     0     3     1
 7  14.3     8  360    245  3.21  3.57  15.8     0     0     3     4
 8  24.4     4  147.    62  3.69  3.19  20       1     0     4     2
 9  22.8     4  141.    95  3.92  3.15  22.9     1     0     4     2
10  19.2     6  168.   123  3.92  3.44  18.3     1     0     4     4
# … with more rows
 

Ошибка возникает, даже если используется только первый канал :

 mtcars_db %>%
          filter(cyl > 2)
 

Кроме того, is.data.frame(mtcars_db) возвращает FALSE .

Кто-нибудь знает, что здесь пошло не так?

Работает ли конвейер здесь только для R фреймов данных?

(Это с последними версиями R 4.03 и tidyverse под Ubuntu 20.04)

Комментарии:

1. Пожалуйста, не могли бы вы проверить ссылку? Я не вижу никакого кода, о котором идет речь, на странице, на которую вы ссылаетесь.

2. @Simon.S.A. Конечно, код находится 17.6 Customising evaluation with functions на странице, на которую дана ссылка. Это второй блок кода.

Ответ №1:

Я предполагаю, что при написании примера было copy_to возвращено соединение с объектом базы данных. Но теперь его возвращаемый тип изменился (или отличается в версии пакета, которую вы загрузили).

Если это так, вам нужна новая команда для подключения к удаленной таблице. Попробуйте выполнить следующее:

 # as per the question
library(dplyr)
con <- DBI::dbConnect(RSQLite::SQLite(), filename = ":memory:")
mtcars_db <- copy_to(con, mtcars)

# confirm is not a (remote) table
is.data.frame(mtcars_db)
# connect to the remote table
mtcars_db <- tbl(con, "mtcars")
# confirm now a (remote) table
is.data.frame(mtcars_db)
 

Возможно, вы также захотите использовать class и class(mtcars) сравнивать class(mtcars_db) .