我正在R中的Shiny中使用sqldf
运行数据库查询。但是出现错误。
ui.R:
observeEvent (input$uploadForTest_1, {
inFile=input$uploadForTest_1
inFileName=input$uploadForTest_1$name
file <-"tss.txt"
tmp = paste("audio/street", inFileName, sep = "/")
res <- read.csv.sql(file,header=FALSE,sql = "select * from file where V1=tmp",sep="\t")
print(res)
})
我成功运行了以下查询:
res <- read.csv.sql(file,header=FALSE,sql = "select * from file where V1='audio/street/b098.wav'",sep="\t")
但是,如果我运行ui.R
中提到的查询,则会出现错误,提示tmp
列不存在:
警告:result_create中的错误:没有这样的列:tmp 86:
我不想在查询中使用字符串。我想使用变量名。因为我不想在查询中对字符串进行硬编码。我可以在查询中使用变量名而不是字符串吗?如果是,那我该怎么办?我没有在Internet上找到解决问题的方法。谢谢。
答案 0 :(得分:2)
在read.csv.sql
前加上fn$
,并在SQL语句中使用'$tmp'
。
fn$read.csv.sql(file, sql = "select * from file where V1 = '$tmp'",
header = FALSE, sep = "\t")
有关更多信息,请参见?fn
和gsubfn小插图。请注意,sqldf会自动加载gsubfn软件包,因此该软件包将已经可用。
答案 1 :(得分:1)
您可以使用sprintf
。另一个选择是将字符串粘贴在一起,但是我发现sprintf
可以轻松完成此任务。
> tmp <- "audio/street/somefile.txt"
> tmp <- "audio/street/somefile.txt"
> "select * from file where V1=tmp"
[1] "select * from file where V1=tmp"
> sprintf("select * from file where V1='%s'", tmp)
[1] "select * from file where V1='audio/street/somefile.txt'"