Объект «sql_translate_env.Oracle» не найден

Мое подключение ROracle к Oracle 11.2g Express перестало работать в R 4.0.4 с dbplyr_2.1.0 после обновления update.packages. Конкретный код

library(dplyr)
library(dbplyr)
library(DBI)
library(ROracle)
library(tidyverse)
sql_translate_env.OraConnection <- dbplyr:::sql_translate_env.Oracle

Ошибка в get(name, envir = asNamespace(pkg), inherits = FALSE): объект 'sql_translate_env.Oracle' не найден


person MartinInFrankfurtAM    schedule 08.03.2021    source источник


Ответы (2)


Похоже, что объект подключения был переименован во внутреннем пространстве имен в рамках обновления предыдущей версии до версии 2.1.0 (::: используется для доступа к внутреннему пространству имен, частям пакета, недоступным через команду library).

К сожалению, изменения во внутренних пространствах имен не являются частью журнала изменений dbplyr. Но вот несколько подходов для отслеживания изменений:

Первый вариант — использовать автозаполнение RStudio

Начните вводить dbplyr::: в консоли, и появится список параметров автозаполнения. Вы можете либо прокрутить это, либо начать вводить имя объекта, чтобы увидеть, что доступно. Я подозреваю, что ввода dbplyr:::sql_transl будет достаточно, чтобы сузить параметры автозаполнения до нужного вам.

Вариант второй: открыть исходный код

Вы можете загрузить исходный код с страницы CRAN пакета. Это предлагает файл tar.gz, содержащий исходный код. Когда загруженный файл окажется в вашем рабочем каталоге, untar("./dbplyr_2.1.0.tar.gz") распакует его и позволит вам изучить исходный код.

Я сделал это и в исходном файле ./dbplyr/R/backend-oracle.R нашел два многообещающих варианта, которые вы могли бы попробовать.

  • sql_translation.Oracle в строке 60
  • sql_translation.OraConnection в строке 137

Самый тщательный способ использовать этот подход — загрузить исходный код для вашей старой версии пакета dbplyr, найти объект, который был переименован, а затем выполнить сравнение различий с исходным кодом для текущей версии.

person Simon.S.A.    schedule 08.03.2021

Причина в том, что dbplyr 2.0 больше не поддерживает Oracle 11.2g, но трансляция Oracle теперь зависит от Oracle 12c (НОВОСТИ версии 2.0, строка 87). Однако смелая магия вуду исходного кода в моем случае позволяет обойти проблему:

Заменять

sql_translate_env.OraConnection <- dbplyr:::sql_translate_env.Oracle

by sql_translate_env.OraConnection <- dbplyr:::sql_translation.Oracle

Заменять

sql_select.OraConnection <- dbplyr:::sql_select.Oracle

by sql_select.OraConnection <- dbplyr:::sql_query_select.Oracle

Заменять

sql_subquery.OraConnection <- dbplyr:::sql_subquery.Oracle

by sql_subquery.OraConnection <- dbplyr:::sql_query_wrap.Oracle

Я догадался об этом, сравнив источник backend-Oracle.R

person MartinInFrankfurtAM    schedule 13.03.2021