Для этой цели пакет sqldf загружает пакет gsubfn, поэтому никаких дополнительных пакетов не требуется. Кроме того, paste
, используемый в показанном в вопросе выражении sqldf
, не требуется, поскольку gsubfn предоставляет для этой цели fn$
, как показано ниже.
gsubfn соответствует регулярному выражению, передает группу захвата (s) ) ко второму аргументу (который является функцией, которая необязательно выражается в формуле, как мы это делаем здесь) и заменяет совпадение выходными данными функции. Мы предположили, что ключевые слова состоят из букв, цифр и пробелов, поэтому мы использовали класс символов [A-Za-z0-9] для определения допустимых символов в ключевом слове, но если они могут содержать другие символы, добавьте их в.
Ниже мы получаем ошибку только потому, что вопрос не определил образец DF
, но он по-прежнему показывает расширенный оператор SQL, переданный бэкэнду, поэтому мы можем видеть, что он работал.
library(sqldf) # sqldf also load gsubfn
input <- "((ELISA) OR (antibody test) AND (blood))"
output <- gsubfn("\\(([A-Za-z0-9 ]+)\\)", ~ sprintf("(tiab LIKE '%%%s%%')", x), input)
fn$sqldf("select * from DF where $output", verbose = TRUE)
подача:
sqldf: library(RSQLite)
sqldf: m <- dbDriver("SQLite")
sqldf: connection <- dbConnect(m, dbname = ":memory:")
sqldf: initExtension(connection)
sqldf: dbGetQuery(connection, 'select * from DF where ((tiab LIKE '%ELISA%') OR (tiab LIKE '%antibody test%') AND (tiab LIKE '%blood%'))')
Error: no such table: DF
sqldf: dbDisconnect(connection)