【发布时间】:2020-02-01 07:12:15
【问题描述】:
之所以出现这个问题,是因为我想为方便起见创建一个函数:
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 翻译的函数的组合,并改为使用这些翻译。
【问题讨论】: