Ошибка в UseMethod («escape»): нет применимого метода для escape, примененного к объекту класса - PullRequest
0 голосов
/ 23 апреля 2019

Я получаю следующее сообщение об ошибке при попытке ввести код в удаленной базе данных 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')"

1 Ответ

1 голос
/ 24 апреля 2019

Скорее всего, проблема вызвана вложенным запросом dplyr.Здесь есть две возможности:

  1. dbplyr не может перевести ваш запрос в SQL,

  2. 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.Поэтому:

  1. Если show_query возвращает SQL, вы должны проверить SQL, чтобы определить, где он не так, и адаптировать ваши R-команды для исправления этого

  2. Если show_query не возвращает или выдает ошибку, то 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()

Если вы не знакомы с полусоединениями, вам может пригодиться этот пост.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.

...