Функция, которая объединяет функции с существующими трансляциями sql в dbplyr - PullRequest
3 голосов
/ 03 октября 2019

Этот вопрос возникает потому, что я хочу сделать функцию для моего удобства:

as.numeric_psql <- function(x) {

   return(as.numeric(as.integer(x)))
}

для преобразования логических значений в удаленной таблице postgres в числовые. Шаг для преобразования в целое число необходим как:

Не определено прямое приведение между числом и логическим значением. Вы можете использовать целое число в качестве среднего уровня. (https://stackoverflow.com/a/19290671/2109289)

Конечно, эта функция работает, как и ожидалось, локально:

copy_to(con_psql, cars, 'tmp_cars')

tmp_cars_sdf <-
    tbl(con_psql, 'tmp_cars')


tmp_cars_sdf %>%
    mutate(low_dist = dist < 5) %>%
    mutate(low_dist = as.numeric(as.integer(low_dist)))

# # Source:   lazy query [?? x 3]
# # Database: postgres 9.5.3
#     speed  dist low_dist
#     <dbl> <dbl>    <dbl>
# 1     4     2        1
# 2     4    10        0
# 3     7     4        1
# 4     7    22        0
# 5     8    16        0

cars %>%
    mutate(low_dist = dist < 5) %>%
    mutate(low_dist = as.numeric_psql(low_dist)) %>%
    head(5)

#   speed dist low_dist
# 1     4    2        1
# 2     4   10        0
# 3     7    4        1
# 4     7   22        0
# 5     8   16        0

Однако она не работает при использовании на удаленном фрейме данных, поскольку as.numeric_psqlотсутствует в списке переводов SQL, поэтому он передается дословно:

> tmp_cars_sdf %>%
+     mutate(low_dist = dist < 5) %>%
+     mutate(low_dist = as.numeric_psql(low_dist))
Error in postgresqlExecStatement(conn, statement, ...) : 
  RS-DBI driver: (could not Retrieve the result : ERROR:  syntax error at or near "as"
LINE 1: SELECT "speed", "dist", as.numeric_psql("low_dist") AS "low_...
                                ^
)

Мой вопрос заключается в том, существует ли простой способ (т. е. не определять собственный перевод SQL) получения dplyr, чтобы понять, чтофункция as.numeric_psql представляет собой набор функций, которые имеют существующие переводы sql, и вместо них используют эти переводы.

...