のクエリに渡す私は光沢のある光沢のあるダッシュボードを使い、データベースから直接データを取り出そうとしているSQLデータベースSQL-SERVERを使って作業する方法を学んでいます。基本的には、日付範囲の開始点と終了点を持つ表の列にマージし、それらを集計してからダイアグラムを作成します。SQL入力の日付範囲をSHINY
私はピカピカに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)
私は、これはいくつかの愚かな間違い、不足している引用符またはこれらの技術を適用する方法の私の一部に誤解であると確信しています。ヘルプをよろしく!
NJburgo によって提案次のサーバーへの編集を置く ##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提案################ #Iは、エラーを取得する:
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クエリを構築するために文字列連結を使用すること自体はバグです。予期しない日付と数値の変換は、それが引き起こす可能性のある問題の1つに過ぎません。すべての引用、書式、セキュリティの問題を避けるには、適切な[パラメータ化されたクエリ](https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html)を使用してください –
shinyがSQLを実行していると推測されます'入力$ dates'の中に値がある前に。私はSQLクエリが発生する前に 'print(dates $ dates [1])'と 'print $ date [2] 'を入力してからアプリケーションを実行します。これは、Rstudioから実行していることを前提としており、Rstudioウィンドウで何が印刷されているかを見ることができます。 –
ねえディーン。入力$ dateを印刷しようとしましたが、違いはありませんでした。日付がハードコーディングされている場合、データが問題なく引き出されるため、問題がここにあることを確認してください。 – LoF10