【发布时间】:2016-08-04 14:49:37
【问题描述】:
我正在学习使用闪亮的仪表板并使用 sql 数据库 SQL-SERVER,我想直接从数据库中提取数据。本质上,这个想法是合并到表格中具有日期范围的起点和终点的列,将它们制成表格,然后绘制图表。
我发现了以下关于如何将 sql 输入语句传递给闪亮的帖子: How to pass input variable to SQL statement in R shiny?
不幸的是,当我尝试应用它时,我得到一个错误“下标超出范围;看起来查询没有被拉入。我已经单独对其进行了测试,并且能够提取数据并顺利完成每个步骤。我正在使用 RODBC 包,我想知道这是否是问题所在。以下是我的代码:
library(stringr)
library(RODBC)
library(circlize)
library(shinydashboard)
library(shiny)
ui <- dashboardPage(skin = "blue",
dashboardHeader(title = "sample"),
dashboardSidebar(disable = TRUE),
dashboardBody(
# Boxes need to be put in a row (or column)
fluidRow(
box(title = "Route Volume", background = "green", solidHeader = TRUE,
plotOutput(outputId= 'plot2'))),
fluidRow(
box(background= "green", dateRangeInput("dates", label = h3("Date Range"),start = '2016-06-01',
end = '2016-06-05')), width = 4
))))
server <- function(input, output) {
database = odbcConnect("datatbase")
output$plot2 = renderPlot({
d = paste0("SELECT
top 30
convert(char(10),datetime,121) as date,
cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3)) as combo,
count(cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3))) as volume
FROM
trips
WHERE datetime >= ",input$dates[1]," AND
datetime < ",input$dates[2],"
GROUP BY
cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3)),
convert(char(10),datetime,121);")
sql = sqlQuery(database, d)
sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ',')))
colnames(sql)[colnames(sql)=="X1"] <- "From"
colnames(sql)[colnames(sql)=="X2"] <- "To"
sql = sql[,c(4,5,3)]
sql = sql[order(sql$volume, decreasing = T),]
chordDiagram(sql)
circos.clear()
})
}
shinyApp(ui, server)
我确信这是一些愚蠢的错误,缺少引号或我对如何应用这些技术的误解。感谢帮助!
##adding edits by Dean to test
database = odbcConnect("database")
output$plot2 = renderPlot({
if(input$dates[1]!= "") {
d = paste0("SELECT
top 30
convert(char(10),datetime,121) as date,
cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3)) as combo,
count(cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3))) as volume
FROM
trips
WHERE
datetime >= ",input$dates[1]," AND
datetime < ",input$dates[2],"
GROUP BY
cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3)),
convert(char(10),datetime,121);")
sql = sqlQuery(database, d)
#i assumed the if statement ended here so I put the
#bracket below
sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ',')))
colnames(sql)[colnames(sql)=="X1"] <- "From"
colnames(sql)[colnames(sql)=="X2"] <- "To"
sql = sql[,c(4,5,3)]
sql = sql[order(sql$volume, decreasing = T),]
chordDiagram(sql)
circos.clear()
}
})
}
按照 NJburgo 的建议对服务器进行编辑 ################################NJburgo 建议############## ## #我收到错误:不知道如何将 input$dates 转换为上课日期
database = odbcConnect("database")
output$plot2 = renderPlot({
dates = as.Date(input$dates)
d = paste0("SELECT
top 30
convert(char(10),datetime,121) as date,
cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3)) as combo,
count(cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3))) as volume
FROM
trips
WHERE
datetime >= {d '",input$dates[1],"'} AND
datetime < {d '",input$dates[2],"'}
GROUP BY
cast(start_destination as varchar(3))
+ (',') + cast(final_destination as varchar(3)),
convert(char(10),datetime,121);")
sql = sqlQuery(database, d)
sql = data.frame(sql, do.call(rbind, str_split(sql$combo, ',')))
colnames(sql)[colnames(sql)=="X1"] <- "From"
colnames(sql)[colnames(sql)=="X2"] <- "To"
sql = sql[,c(4,5,3)]
sql = sql[order(sql$volume, decreasing = T),]
chordDiagram(sql)
circos.clear()
})
}
【问题讨论】:
-
使用字符串连接构造 SQL 查询本身就是一个错误。日期和数字参数的意外转换只是它可能导致的问题之一。使用正确的parameterized queries 来避免所有引用、格式和安全问题
-
一种猜测是,在
input$dates中包含值之前,闪亮正在运行 sql。我会在 sql 查询发生之前放置print(input$dates[1])和print(input$dates[2]),然后运行应用程序。这假设您从 Rstudio 运行,以便您可以在 Rstudio 窗口中看到它打印的内容。 -
嘿,院长。我尝试打印 input$dates 但没有任何区别。我确定问题就在这里,因为当日期被硬编码时,数据会毫无问题地提取。
-
我没想到印刷会有所作为。这只是一个调试步骤。它是打印日期还是打印空白?
-
明白了。它没有打印任何东西。只是空白,好像 Shiny 没有解释 input$dates 以放入 SQL 查询,这就是为什么查询也是空白的原因
标签: sql-server r shiny rodbc shinydashboard