Вы отметили это как dbplyr
, хотя в вашем вопросе об этом нет упоминания. Если вы используете dbplyr
, то проблема связана с тем, как dbplyr
переводит с R на язык базы данных (в вашем случае это большой запрос).
dbplyr
имеет ряд встроенных переводов, которые делают преобразование (например, filter
переводится в WHERE
предложения). Эти переводы могут искать значения из переменных в соответствии с вашим примером:
date_from <- as.character(today() - 730)
table1 %>% filter(date > date_from)
Но не могут сказать подфункциям, следует ли оценивать, переводить или оставить как есть. Следовательно, согласно этой документации dbplyr оставляет любые "неизвестные" функции как есть. Это означает, что
table1 %>% filter(date > as.character(today() - 730))
, вероятно, переводится в нечто вроде
SELECT ...
FROM ...
WHERE date > as.character(today() - 730)
, что приводит к ошибке, так как это недопустимый синтаксис для базы данных.
Вы можете проверить перевод с использованием show_query()
:
table1 %>% filter(date > as.character(today() - 730)) %>% show_query()
Этот вопрос задает очень похожую проблему - переводы определяются для функций, которые они используют, но не для пользовательских функций, которые действует как обертка. Возможность определения пользовательских переводов решит оба вопроса, но в настоящее время это представляется невозможным.
Существует два обходных пути:
- Из документации dbplyr Вы можете использовать
sql()
для вставки необработанной строки SQL (которая не будет переведена). - Вы можете написать свои собственные функции, которые возвращают пользовательские определения таблиц. См. Раздел «Создание пользовательских функций» этого ответа .