Добавьте одинарную кавычку в начало и конец вектора строки, которая будет передана в 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)
Другие вопросы по тегам