R-язык: использование UDF в операторах SQL - PullRequest
0 голосов
/ 10 октября 2018

Я новичок в R, и я пытаюсь использовать мой UDF в операторе SQL (через функцию sqldf).Тем не менее, я получаю сообщение об ошибке no such function

Позволяет ли sqldf использовать UDFs?

Вот пример кода:

mySum <- function(x,y) { ret <- x+y return(ret) } 
data1=data.frame("var1"=1:3, "var2" = 5:7) 
View(data1) 
sSQL1 = "SELECT var1,var2,mySum(var1,var2) AS sum FROM data1" 
data2 <- sqldf(sSQL1,stringsAsFactors = FALSE) View(data2) 

При запуске я получаю сообщение об ошибке:

Error in result_create(conn@ptr, statement) : no such function: mySum

1 Ответ

0 голосов
/ 11 октября 2018

Расширения SQLite

Если вы используете бэкэнд RSQLite, тогда RSQLite включает ряд функций, написанных на C, которые можно использовать из SQL, и sqldf делает их доступными.Смотрите ?initExtensions в пакете RSQLite.Если один из них уже делает то, что вы хотите, то это может быть решением.

Добавление функций SQL

Из различных поддерживаемых бэкэндов SQLite позволяет добавлять функции C, H2 позволяет добавлять функции Java, а MySQL и PostgreSQL позволяют добавлять функции, написанные на SQL, с использованием CREATE FUNCTION.

Предварительная обработка текста оператора SQL

обратные пометки В общем, вы не можете смешивать R с вашими операторами SQL;однако вы можете выполнить предварительную текстовую обработку SQL, используя fn$sqldf(...), а затем $ для замены одного значения или обратных кавычек для замены результата выражения R.Например,

library(sqldf)

mySum <- function(x, y) paste(x, y, sep = "+")
fn$sqldf("select Time, demand, `mySum('Time', 'demand')` total from BOD", verbose = TRUE)

дает следующее, где я добавил стрелку в конце строки, которая показывает оператор, фактически переданный в бэкэнд.

sqldf: library(RSQLite)
sqldf: m <- dbDriver("SQLite")
sqldf: connection <- dbConnect(m, dbname = ":memory:")
sqldf: initExtension(connection)
sqldf: dbWriteTable(connection, 'BOD', BOD, row.names = FALSE)
sqldf: dbGetQuery(connection, 'select Time, demand, Time+demand total from BOD') <--
sqldf: dbDisconnect(connection)
  Time demand total
1    1    8.3   9.3
2    2   10.3  12.3
3    3   19.0  22.0
4    4   16.0  20.0
5    5   15.6  20.6
6    7   19.8  26.8

См. ?fn впакет gsubfn и обратите внимание, что пакет gsubfn автоматически становится доступным для sqldf, поэтому вам не требуется оператор library.

знак доллара Выше приведен пример использования обратных галочек,Вот пример использования $ для того же.Вывод будет таким же.

mySum <- function(x, y) paste(x, y, sep = "+")
total <- mySum("Time", "demand")
fn$sqldf("select Time, demand, $total total from BOD")
...