Этот вопрос возникает потому, что я хочу сделать функцию для моего удобства:
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, и вместо них используют эти переводы.