r - UseMethod(“escape”)中的错误:没有适用于“escape”的方法应用于类对象
问题描述
Postgres
当我在远程数据库上尝试一些代码时,我收到以下错误消息。
以下 peusdo 重现代码在数据帧是本地的时效果很好,但在它们很远时效果不佳。
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()
将返回类似于以下 SQL 命令的内容:
SELECT 2 * old_col + id AS new_col, id
FROM database.my_table
只有当 R 到 SQL 的转换已经成为可能时,才会发生这种情况。所以:
如果
show_query
返回 SQL,您应该检查 SQL 以确定错误的位置并调整您的 R 命令以更正此问题如果
show_query
不返回或给出错误,则 dbplyr 无法翻译您的查询,需要对其进行重组。
预计问题是由嵌套的 dplyr commands 引起的(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()
如果您不熟悉半联接,您可能会发现这篇文章很有帮助。R 还支持使用反连接。
编辑:误读了您的初始查询。
当您想在输出表中添加存在/不存在的指示器时event_id
,您可能可以避免半连接或反连接。也许类似于以下内容:
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 那样容易处理这些。
推荐阅读
- python - 如何在滑动窗口中保持第一个窗口不变?
- linux - 关于使用 GDB 的代码 x86 的错误内存地址
- java - 如何编写一种方法来轻松创建不同类型的子类
- python - LAB 图像的每个组件的示例参考阈值是多少?
- ios - Xcode - ld:未找到架构 arm64 的符号
- javascript - 将所有用户移至您的频道 (Discord JS)
- reactjs - 使用默认数组值反应 useState 不会重新渲染
- javascript - 我是否只需要获取请求来构建 html?
- python - 如何使用 PyVista 将矢量箭头添加到 ABC 字段等 3D 绘图?
- xcode - 如何仅在 Xcode 中为控制台启用换行?