#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’ трассировки:
- mtcars_db %>% filter(cyl> 2) %>% select(mpg: hp) %>% head(10) %>% . show_query()
- С помощью Visible(eval(quote(
_fseq
(_lhs
)), env, env))- eval(quote(
_fseq
(_lhs
)), env, env)- eval(quote(
_fseq
(_lhs
)), env, env)_fseq
(_lhs
)- freduce(значение,
_function_list
)- function_list[i]
- фильтр (., 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)
.