Включение генерировать_последовательность SQLite в библиотеке sqldf R под окнами MS - PullRequest
0 голосов
/ 01 декабря 2018

Я надеюсь использовать табличную функцию SQLite3 generate_series из библиотеки R sqldf, которая, в свою очередь, использует библиотеку RSQLite.Я ожидаю, что однажды установив / настроив, я смогу вызвать его следующим образом:

sqldf('SELECT value FROM generate_series(5,100,5)')

Из чтения Загружаемые расширения во время выполнения , я понимаю, что мне нужно будет сначала позвонить load_extension (X) , конкретно как

sqldf('select load_extension("C:\\my\\path\\to\\sqlite\\pathext\\misc\\series.c")')

Однако я также читал, что Загрузка расширения отключена по умолчанию , и я не могу понять, как мне придется повернутьэто изнутри sqldf вызов.Это вообще возможно?Придется ли мне скомпилировать свой собственный sqlite3 с этим переключателем по умолчанию?

Далее, я хотел бы подтвердить, что нет ярлыка для Сборка загружаемого расширения с помощью MinGW потому что, очевидно, без компиляции ext / misc / series.c , я обнаружу, что SQLite generate_series отсутствует , и ни одна из загрузок не обеспечивает его компиляцию.

Если я правильно понимаю, мне НЕ нужно будет компилировать весь SQLite , я могу использовать загруженную версию вместе с скомпилированным мной расширением.

Наконец, как мне убедиться, что версия sqlite3, которую sqldf / RSQLite выбирает, является той, которую я настроил?Это заставит меня скомпилировать свой собственный RSQLite, а не просто install.packages(c('RSQLite'))?

Все это кажется большой работой только ради одного этого расширения.Есть ли лучший способ пойти?

Спасибо за помощь!

1 Ответ

0 голосов
/ 01 декабря 2018

Предлагаем вам отправить проблему на сайт RSQLite github , чтобы добавить ее, но пока что есть несколько обходных путей, которые не связаны с перестройкой SQLite и RSQLite.

1) Рекурсивный CTE Это можно сделать без расширения, используя CTE, как показано в https://www.sqlite.org/series.html.

В частности, попробуйте этот код sqldf:

library(sqlite)

start <- 1
end <- 3
step <- 1
fn$sqldf("
  WITH RECURSIVE generate_series(value) AS (
    SELECT $start
    UNION ALL
    SELECT value+$step FROM generate_series
     WHERE value+$step<=$end
) SELECT value FROM generate_series
")
##   value
## 1     1
## 2     2
## 3     3

2) Нерекурсивный CTE Предположим, у нас есть фрейм данных, о котором известно как минимум требуемое количество строк.Это содержание не имеет значения в противном случае.Например, встроенный фрейм данных BOD имеет 6 строк, и предположим, что нам нужно 3 строки, которые не больше 6, поэтому он будет работать.

fn$sqldf("
  WITH generate_series(value) AS (
    SELECT $start + $step * (rowid - 1) FROM BOD LIMIT ($end - $start) / $step + 1
  ) SELECT value FROM generate_series
")
##   value
## 1     1
## 2     2
## 3     3

Если start и step равны 1это можно упростить до:

fn$sqldf("
  WITH generate_series(value) AS (
    SELECT rowid FROM BOD LIMIT $end
  ) SELECT value FROM generate_series
")

3) Создать в R Другая возможность - создать серию в R, а затем просто использовать ее в sqldf:

generate_series <- data.frame(value = seq(start, end, step))
sqldf("SELECT value FROM generate_series")
##   value
## 1     1
## 2     2
## 3     3
...