この質問は確かにこの質問に似ていますが、提供された回答は私の例には十分ではありません。
データベースに接続する光沢のあるアプリを作成しています。ユーザーはいくつかの入力を提供でき、いくつかの「既定の」クエリが実行されます。ここで、アプリの終了時にデータベースへの接続が閉じていることを確認したいと思います。ボタンとstopApp
関数を使用することもできますが、これはユーザーが適切で、常にそのボタンをクリックすることを前提としています。ユーザーは、データベース接続を開いたままウィンドウを閉じる可能性があるため、ユーザーがアプリ ウィンドウを閉じたときに接続を明示的に閉じる方法を見つけたいと考えています。
1 つの解決策は、新しい接続をインスタンス化し、各クエリの最後に閉じることだと思いますが、それは非効率的です。
問題を示すための実用的なコードを次に示します。Rstudio からこのアプリを実行してからウィンドウを閉じても、 に従って既存の接続が残っていますdbListConnections(PostgreSQL())
。ファイルの末尾に追加dbDisconnect(con)
しても役に立ちません。
library(shiny)
library(RPostgreSQL)
server <- shinyServer(function(input, output){
# Read in the dataset
connectDB <- eventReactive(input$connectDB, {
if(input$drv != "postgresql"){
stop("Only 'postgresql' implemented currently")
}else{
drv <- dbDriver("PostgreSQL")
port = 5432
}
con <- dbConnect(drv, user = input$user, password = input$passwd,
port = port, host = input$server, dbname=input$db_name)
con
})
output$test <- renderText({
con <- connectDB()
"connection success"
})
})
ui <- shinyUI(
fluidPage(
titlePanel("Test Connection"),
sidebarLayout(
sidebarPanel(
textInput("drv", "Database Driver", value="postgresql"),
textInput("user", "User ID"),
textInput("server", "Server", value="server"),
textInput("db_name", "Database Name", value="dbName"),
passwordInput("passwd", "Password"),
actionButton("connectDB", "Connect to DB")
),
mainPanel(
textOutput("test")
)
)
)
)
shinyApp(ui=ui, server=server)