Конвертировать конвейер dplyr в строку SQL - PullRequest
1 голос
/ 25 февраля 2020

Я хотел бы преобразовать (короткий) dplyr конвейер в строковое представление его эквивалента SQL. Например:

library(dplyr)
dbplyr::lazy_frame() %>% filter(foo == 'bar')

распечатает по существу то, что я ищу, а именно:

<SQL>
SELECT *
FROM `df`
WHERE (`foo` = 'bar')

проблема в том, что это просто напечатано . В частности, я не вижу, как присвоить его строке. Я попытался добавить %>% show_query(), но я считаю, что это имеет тот же результат (т.е. отображение запроса, а не преобразование в строку). Добавление %>% as.character() действительно производит что-то, но это не SQL (это символьный вектор, первый элемент которого "list(name = \"filter\", x = list(x = list(), vars = character(0)), dots = list(~foo == \"bar\"), args = list())").

Ответы [ 2 ]

3 голосов
/ 25 февраля 2020

Вы можете захватить вывод:

library(dplyr)
x<-capture.output(dbplyr::lazy_frame() %>% filter(foo == 'bar'))
x
[1] "<SQL>"                 "SELECT *"              "FROM `df`"             "WHERE (`foo` = 'bar')"

или

dbplyr::lazy_frame() %>% filter(foo == 'bar')%>%capture.output
1 голос
/ 25 февраля 2020

Используйте remote_query, чтобы получить c("sql", "character"), а затем преобразовать его в character.

library(dbplyr)

lazy_frame() %>%
  filter(foo == 'bar') %>%
  remote_query %>%
  as.character
## [1] "SELECT *\nFROM `df`\nWHERE (`foo` = 'bar')"
...