在将被输入 sqldf 的字符串的向量的开头和结尾添加单引号

Add single quote to start and end of the vector of a string which would be fed into 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)

您可以为此使用 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)