Добавьте одинарную кавычку в начало и конец вектора строки, которая будет передана в sqldf
У меня есть вектор строки, как это:
vec1=letters[1:5]
df=data.frame(a=1:10, b=letters[1:10])
Я хочу, чтобы подмножество этого фрейма данных путем подачи строки в SQL-выражении
vec1=letters[1:5]
vec3=paste("'", paste(vec1, collapse = "','"), "'", sep = '')
p=paste("select * from df where b in (", vec3, ")")
sqldf(p)
Это хорошо работает, но есть ли какой-нибудь элегантный способ сделать это. Я пробовал с squotes
тоже, но это не дает мне желаемую одинарную кавычку.
vec3=paste(vec1, collapse = "','")
vec3=sQuote(vec3)
2 ответа
Решение
Ты можешь использовать sprintf
за это.
sprintf("'%s'", paste(vec1, collapse = "','"))
создать функцию сделает ее более читабельной...
addQuotes <- function(x) sprintf("'%s'", paste(x, collapse = "','"))
addQuotes(vec1)
Пакет sqldf загружает пакет gsubfn, предоставляющий fn
для этого. fn
поддерживает обратные и долларовые замены для кода и отдельных переменных соответственно. Например, попробуйте любой из них. Увидеть ?fn
и примеры на странице sqldf github.
fn$sqldf("select * from df where b in ( `toString(shQuote(vec1, 'sh'))` ) ")
p <- fn$identity("select * from df where b in ( `toString(shQuote(vec1, 'sh'))` ) ")
sqldf(p)
s <- toString(shQuote(vec1, 'sh'))
p <- fn$identity("select * from df where b in ( $s ) ")
sqldf(p)