1

通常在开发连接到数据库的 Shiny 应用程序时,当应用程序位于本地/服务器上时,需要使用不同的用户名。

数据库连接的pool方法是最有效的(https://shiny.rstudio.com/articles/pool-dplyr.html),但是在函数之外调用与数据库的连接shinyServer[推荐]意味着不能使用session$clientData$url_hostname

我想做一个闪亮的应用程序,实现以下目标:

  • 使用由应用程序是否在 127.0.0.1 上运行决定的用户名启动数据库池

  • 显示表的 rows_to_show 行,其中 rows_to_show 由 a 设置sliderInput

使用 rsconnet() 运行/部署应用程序的方法就足够了。

## ui.R
shinyUI(fluidPage(
  sliderInput(
    "rows_to_show",
    "Exponent",
    min = 10,
    max = 50,
    value = 5
  ),
  dataTableOutput("table")
))


## server.R
library("shiny")
library("tidyverse")
library("dbplyr")
library("pool")
library("RMySQL")
## tryCatch so the app will actually run
tryCatch(
  the_db <- dbPool(
    drv = RMySQL::MySQL(),
    dbname = "the_db",
    port = 3306,
    host = "163.1.169.xxx",
    user = "database_username" 
  ),
  error = function(e)
    e
)

shinyServer(function(input, output, session) {
  database_username <- eventReactive(input$exponent,
                                     {
                                       if (session$clientData$url_hostname == "127.0.0.1") {
                                         "local_username"
                                       } else {
                                         "remote_username"
                                       }
                                     }, ignoreInit = FALSE)


  output$table <- renderDataTable({
    rows_to_show <- as.numeric(input$rows_to_show)

    # the_db %>%
    #   tbl("my_table") %>%
    #   collect() %>%
    #   slice(1:rows_to_show)
    iris %>%
      slice(1:rows_to_show)

  })

})
4

0 回答 0