UseMethod("escape") 错误:没有适用于 'escape' 的方法应用于 class 的对象
Error in UseMethod("escape") : no applicable method for 'escape' applied to an object of class
我在远程 Postgres
数据库上尝试一些代码时收到以下错误消息。
以下 peusdo-reproducing 代码在数据帧位于本地但在远处时效果很好。
library(tidyverse)
library(dbplyr)
library(RPostgres)
event <- tibble(id = c("00_1", "00_2", "00_3", "00_4", "00_5", "00_6", "00_7"),
type_id = c("A", "B", "C", "B", "A", "B", "C"))
detail <- tibble(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L),
event_id = c("00_1", "00_1", "00_2", "00_2", "00_3", "00_4", "00_4", "00_5", "00_6", "00_6", "00_7", "00_8"),
type_id = c(3L, 4L, 6L, 7L, 2L, 6L, 3L, 2L, 6L, 5L, 2L, 1L))
event_f <- event %>%
mutate(new_variable = id %in% (detail %>%
filter(type_id == 6) %>%
pull(event_id))) %>%
collect()
Error in UseMethod("escape") : no applicable method for 'escape' applied to an object of class "c('tbl_PqConnection', 'tbl_dbi', 'tbl_sql', 'tbl_lazy', 'tbl')"
问题很可能是由嵌套的 dplyr 查询引起的。这里有两种可能:
dbplyr 无法将您的查询翻译成 SQL、
dbplyr 翻译了您的查询,但它无效 SQL。
如何判断
dbplyr 尝试将每组命令翻译成 SQL。验证这一点的一种方法是使用函数 show_query()
.
例如R命令:
my_table %>% mutate(new_col = 2 * old_col + id) %>% select(new_col, id) %>% show_query()
会 return 类似于下面的 SQL 命令:
SELECT 2 * old_col + id AS new_col, id
FROM database.my_table
这只有在可以将 R 翻译成 SQL 时才会发生。因此:
If show_query
returns SQL, 你应该检查 SQL 以确定错误的地方并调整你的 R 命令来纠正这个
如果 show_query
没有 return,或者出现错误,那么 dbplyr 无法翻译您的查询,需要对其进行重组。
预计问题是由嵌套的dplyr命令引起的(detail %>% filter %>% pull)
,我建议将其替换为semi_join如下:
detail_f <- detail %>%
filter(type_id == 6)
event_f <- event %>%
semi_join(detail_f, by = c("id" = "type_id")) %>%
collect()
如果您不熟悉半连接,您可能会发现 post 很有帮助。 R也支持反连接的使用。
编辑:误读了您的初始查询。
因为您想在输出 table 中为 event_id
的 presence/absence 添加一个指示符,您可能可以避免半连接或反连接。可能类似于以下内容:
detail_f <- detail %>%
filter(type_id == 6) %>%
select(id_to_compare = event_id) %>%
mutate(new_variable = 1)
event_f <- event %>%
left_join(detail_f, by = c("id" = "id_to_compare")) %>%
mutate(new_variable = ifelse(is.na(new_variable), 0, new_variable) %>%
collect()
注意,我在这里使用了 0 和 1 而不是 FALSE
和 TRUE
,因为 SQL 的某些版本不像 R 那样容易处理这些问题。
我在远程 Postgres
数据库上尝试一些代码时收到以下错误消息。
以下 peusdo-reproducing 代码在数据帧位于本地但在远处时效果很好。
library(tidyverse)
library(dbplyr)
library(RPostgres)
event <- tibble(id = c("00_1", "00_2", "00_3", "00_4", "00_5", "00_6", "00_7"),
type_id = c("A", "B", "C", "B", "A", "B", "C"))
detail <- tibble(id = c(1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 10L, 11L, 12L),
event_id = c("00_1", "00_1", "00_2", "00_2", "00_3", "00_4", "00_4", "00_5", "00_6", "00_6", "00_7", "00_8"),
type_id = c(3L, 4L, 6L, 7L, 2L, 6L, 3L, 2L, 6L, 5L, 2L, 1L))
event_f <- event %>%
mutate(new_variable = id %in% (detail %>%
filter(type_id == 6) %>%
pull(event_id))) %>%
collect()
Error in UseMethod("escape") : no applicable method for 'escape' applied to an object of class "c('tbl_PqConnection', 'tbl_dbi', 'tbl_sql', 'tbl_lazy', 'tbl')"
问题很可能是由嵌套的 dplyr 查询引起的。这里有两种可能:
dbplyr 无法将您的查询翻译成 SQL、
dbplyr 翻译了您的查询,但它无效 SQL。
如何判断
dbplyr 尝试将每组命令翻译成 SQL。验证这一点的一种方法是使用函数 show_query()
.
例如R命令:
my_table %>% mutate(new_col = 2 * old_col + id) %>% select(new_col, id) %>% show_query()
会 return 类似于下面的 SQL 命令:
SELECT 2 * old_col + id AS new_col, id
FROM database.my_table
这只有在可以将 R 翻译成 SQL 时才会发生。因此:
If
show_query
returns SQL, 你应该检查 SQL 以确定错误的地方并调整你的 R 命令来纠正这个如果
show_query
没有 return,或者出现错误,那么 dbplyr 无法翻译您的查询,需要对其进行重组。
预计问题是由嵌套的dplyr命令引起的(detail %>% filter %>% pull)
,我建议将其替换为semi_join如下:
detail_f <- detail %>%
filter(type_id == 6)
event_f <- event %>%
semi_join(detail_f, by = c("id" = "type_id")) %>%
collect()
如果您不熟悉半连接,您可能会发现
编辑:误读了您的初始查询。
因为您想在输出 table 中为 event_id
的 presence/absence 添加一个指示符,您可能可以避免半连接或反连接。可能类似于以下内容:
detail_f <- detail %>%
filter(type_id == 6) %>%
select(id_to_compare = event_id) %>%
mutate(new_variable = 1)
event_f <- event %>%
left_join(detail_f, by = c("id" = "id_to_compare")) %>%
mutate(new_variable = ifelse(is.na(new_variable), 0, new_variable) %>%
collect()
注意,我在这里使用了 0 和 1 而不是 FALSE
和 TRUE
,因为 SQL 的某些版本不像 R 那样容易处理这些问题。