0
ローカルデータベースを照会して結果をテーブルに返すShinyアプリケーションを構築しました。実行可能な2つのクエリがあり、それぞれは個別のアクションボタンによって制御されます。反応的な構造化Shinyアプリケーションでのクエリービルドと結果のエクスポート
アプリは正常に動作しますが、データダウンロードボタンを作成しようとすると問題が発生しました。問題は、それぞれのクエリを取得するために2つの独立したリアクティブ関数を作成したことです。両方のクエリの結果を同じ 'オブジェクト' [おそらく間違っている用語を却下]にする方法を考えることができません - ダウンロードボタンは、実行されたクエリに応じて現在のデータをダウンロードします。このための醜い修正は、ただ2つのダウンロードボタンを作ることですが、私はそこに優雅な解決策があると確信しています。ここで
は私のコードです:
global.R:
library(shiny)
library(RSQLite)
library(data.table)
library(dplyr)
library(zoo)
library(igraph)
# Import parts list and materials list
setwd("REDACTED/Scripts/shiny/LegislationQuery/")
partList <- read.csv("partList.csv")
materialsList <- read.csv("materialsList.csv")
# Set up local.db
if(file.exists("local.db")) file.remove("local.db")
myDB<-dbConnect(SQLite(),"local.db")
dbWriteTable(myDB, "partList", partList, overwrite = TRUE)
dbWriteTable(myDB, "Materials", materialsList, overwrite = TRUE)
server.R:
library(shiny)
library(RSQLite)
library(data.table)
library(dplyr)
library(zoo)
library(igraph)
shinyServer(function(input, output) {
sqlDown <- reactive ({paste("with recursive Parts(P,S, Level) as (select Part as P, SubPart as S, 0 from partList union select Parts.P, partList.SubPart as S, Parts.Level + 1 as Level from Parts, partList where Parts.S = partList.Part) select P as Part, S as SubPart, Level from Parts where P = ","'", input$partForQuery, "'", sep = "")})
sqlUp <- reactive ({paste("with Parts(subPart, part, level) as (select SubPart as subPart, Part as part, 0 as level from partList where subPart =", "'", input$partForQuery, "'", "union select partList.SubPart, partList.Part as part, Parts.level - 1 as level from Parts, partList where Parts.part = partList.SubPart) select subPart as SubPart, part as Part, level as Level from Parts", sep = "")})
queryDownData <- function() {dbGetQuery(myDB, sqlDown())}
queryUpData <- function() {dbGetQuery(myDB, sqlUp())}
observeEvent(input$RunDownQuery, {
output$table <- renderDataTable(data.table({
data = queryDownData()}))
})
observeEvent(input$RunUpQuery, {
output$table <- renderDataTable(data.table({
data = queryUpData()}))
})
output$downloadData <- downloadHandler(
filename = function() { paste(input$partForQuery, '.csv', sep='') },
content = function(file) {
write.csv(queryDownData(), file)
}
)
})
ui.R:
library(shiny)
library(data.table)
shinyUI(pageWithSidebar(
headerPanel("Part Query"),
sidebarPanel(
textInput("partForQuery", "Part Number:"),
fluidRow(
actionButton("RunDownQuery", label = "Run Query (Down)"),
actionButton("RunUpQuery", label = "Run Query (Up)")
),
downloadButton('downloadData', 'Download')
),
mainPanel(
dataTableOutput("table")
)
))
このような何かが動作するはず
何らかの理由でwrite.csv呼び出しの中にifelseがあると、出力が正しくない(私が疑ういくつかの型の処理の問題)ため、小さな編集が必要でした。だから、私はホルダーオブジェクトを作成し、write.csv呼び出しの外にifelseを実行し、それは素晴らしい作品です!助けてくれてありがとう。 – niklz