Как создать пользовательские функции SQL с кодом R в dbplyr?

Я использую dbplyr для запроса базы данных MSSQL и часто округляю даты до первого числа месяца, используя mutate(YM = DATEFROMPARTS(YEAR(Date), MONTH(Date), 1)). Я хотел бы иметь возможность создать функцию R, которая упростит это для меня, например введите mutate(YM = round_month(Date)) и попросите dbplyr преобразовать это в функцию DATEFROMPARTS выше.

Похоже, я мог бы сделать это с помощью функции sql_expr() в dbplyr. Читая код R пакета, кажется, что именно так транслируются функции R. Например:

year = function(x) sql_expr(DATEPART(YEAR, !!x))

См .: https://github.com/tidyverse/dbplyr/blob/master/R/backend-mssql.R

Итак ... Я попытался сделать то же самое самостоятельно:

round_month <- function(x) sql_expr(DATEFROMPARTS(YEAR(!!x), MONTH(!!x), 1))

mytbl %>%
  mutate(YM = round_month(Date)) %>%
  show_query()

Я ожидал получить вот что:

<SQL>
SELECT DATEFROMPARTS(YEAR("Date"), MONTH("Date"), 1) AS YM
FROM mytbl

Но вместо этого я получаю следующее:

<SQL>
SELECT round_month("Date") AS YM
FROM mytbl

Что явно ничего не делает. Что я делаю неправильно?


person Aaron Cooley    schedule 10.06.2019    source источник


Ответы (1)


Попробуйте это:

mytbl %>%
  mutate(YM = !!round_month("Date")) %>%
  show_query()

На основе этого ответа: https://community.rstudio.com/t/how-to-subtract-dates-using-dbplyr/22135/5

person David Klotz    schedule 10.06.2019
comment
Хм ... по-прежнему появляется ошибка: Error in enexpr(x) : object 'Date' not found - person Aaron Cooley; 10.06.2019
comment
Я получаю эту ошибку, если делаю !!round_month(Date) Не с !!round_month("Date") - person David Klotz; 10.06.2019