의 쿼리에 전달 저는 반짝이는 반짝이는 대시 보드를 사용하고 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)
난이 바보 같은 실수, 누락 된 인용 부호 또는 이러한 기술을 적용하는 방법의 나의 부분에 오해 확신 : 다음은 내 코드입니다. 도움을 감사하십시오 !!
##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 제안 ################ 오류를 얻을 #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 쿼리를 생성하기 위해 문자열 연결을 사용하는 것은 버그 자체입니다. 예기치 않은 날짜 및 숫자 매개 변수의 변환은 발생할 수있는 문제 중 하나 일뿐입니다. 모든 인용, 형식 및 보안 문제를 피하려면 적절한 [매개 변수화 된 쿼리] (https://cran.r-project.org/web/packages/RODBCext/vignettes/Parameterized_SQL_queries.html)를 사용하십시오 –
shiny는 SQL을 실행하고 있습니다. '입력 $ dates'에 값이 들어 오기 전에. sql 쿼리가 발생하기 전에 print (input $ dates [1])와 print (input $ dates [2])를 넣고 app을 실행합니다. 여기서는 Rstudio에서 실행 중이므로 Rstudio 창에서 인쇄 내용을 볼 수 있습니다. –
안녕 딘. 나는 입력 된 $ 날짜를 인쇄하려고했지만 아무런 효과가 없었다. 날짜가 하드 코드 된 경우 데이터가 문제없이 처리되므로 문제가 발생했는지 확인하십시오. – LoF10