R Shinny:在Shinny应用程序中的反应式RMySQL查询中未找到表对象

R Shinny:在Shinny应用程序中的反应式RMySQL查询中未找到表对象,mysql,r,shiny,Mysql,R,Shiny,[编辑]:agstudy的解决方案对我有效。 我有一个闪亮的应用程序,允许用户在MySQL数据库的三个表之间切换。用户可以选择Renderable用于生成对象的表 我将if语句放在renderable中,以响应用户选择的表 当我运行应用程序时,任何表格都无法打印,无法查看 服务器.R library(shiny) library(RMySQL) con <- dbConnect(RMySQL::MySQL(),user="x",password="x",host="dbhost",dbn

[编辑]:agstudy的解决方案对我有效。

我有一个闪亮的应用程序,允许用户在MySQL数据库的三个表之间切换。用户可以选择Renderable用于生成对象的表

我将if语句放在renderable中,以响应用户选择的表

当我运行应用程序时,任何表格都无法打印,无法查看

服务器.R

library(shiny)
library(RMySQL)

con <- dbConnect(RMySQL::MySQL(),user="x",password="x",host="dbhost",dbname="db")

shinyServer(function(input, output) {

  data <- reactive({ 
    selectInput("input$data", "Choose your Input:", choices = c('data1'='1','data2'='2', 'data3'='3'))
  })

    output$table <- renderTable({
      if(input$data == data1){
        query1 <- reactive({ "SELECT *
                            FROM data1
                            ORDER BY var1, var2"})
        reactive({dbGetQuery(con,query1())})
        head(data())

      } else if(input$data == data2){
        query1 <- reactive({ "SELECT *
                            FROM data2
                            ORDER BY var1, var2"})
        reactive({dbGetQuery(con,query1())})
        head(data())

      } else if(input$data == data3){
        query1 <- reactive({ "SELECT *
                            FROM data3
                            ORDER BY var1, var2"})
        reactive({dbGetQuery(con,query1())})
        head(data())

      } else print("Select a dataset")

    })

})

这里的问题在任何情况下都与MySQLserver无关,但存在一个无UI逻辑。如果不隔离代码部分,在
shinny
中编程并不容易:

  • 输入:在ui界面中定义
  • 反应式功能:应在每次更改输入时更改
  • 输出:一旦输入数据被被动功能更改,将刷新输出
您无法理解反应式。基本思想是,您不需要手动刷新UI,只要更改输入参数,就应该自动刷新UI

在这里,我使用闪亮的逻辑完全重写您的代码:

library(RMySQL)
library(shiny)
## this a public function that will be used
## in the server side to connect to the data base
## and retrieve data
get_data <- 
  function(query){
    on.exit(dbDisconnect(conn)) ## important to close connection
    conn <- dbConnect("MySQL",user="xuser",
                      password="xpws",
                      host="xhost",
                      dbname="xdbname")
    dbGetQuery(con,query)
  }

server <- shinyServer(
  function(input, output) {
    ## the reactive engine that will refresh query 
    ## each time input changed 
    query <- reactive( sprintf("SELECT * 
                    FROM %s 
                    ORDER BY var1, var2",input$data)

    )
    ## simply  displaying reactive inputs
    output$table <- renderTable(
      if(input$data!="") get_data(query())
    )
  })

## define ui elements by step
## for easy indenting
ui_panel <- 
  tabPanel("Test",
           sidebarLayout(
             sidebarPanel(
               selectInput("data", label = "Data set",
                           choices = c("","data1", "data2", "data3"))
             ),
             mainPanel(
               tableOutput("table")
             )
           )
  )


ui <- shinyUI(navbarPage("Test",ui_panel))

runApp(list(ui=ui,server=server))
库(RMySQL)
图书馆(闪亮)
##这是一个将要使用的公共函数
##在服务器端连接到数据库
##并检索数据

获取数据谢谢您的快速回复。这个解决方案对我有效。
library(RMySQL)
library(shiny)
## this a public function that will be used
## in the server side to connect to the data base
## and retrieve data
get_data <- 
  function(query){
    on.exit(dbDisconnect(conn)) ## important to close connection
    conn <- dbConnect("MySQL",user="xuser",
                      password="xpws",
                      host="xhost",
                      dbname="xdbname")
    dbGetQuery(con,query)
  }

server <- shinyServer(
  function(input, output) {
    ## the reactive engine that will refresh query 
    ## each time input changed 
    query <- reactive( sprintf("SELECT * 
                    FROM %s 
                    ORDER BY var1, var2",input$data)

    )
    ## simply  displaying reactive inputs
    output$table <- renderTable(
      if(input$data!="") get_data(query())
    )
  })

## define ui elements by step
## for easy indenting
ui_panel <- 
  tabPanel("Test",
           sidebarLayout(
             sidebarPanel(
               selectInput("data", label = "Data set",
                           choices = c("","data1", "data2", "data3"))
             ),
             mainPanel(
               tableOutput("table")
             )
           )
  )


ui <- shinyUI(navbarPage("Test",ui_panel))

runApp(list(ui=ui,server=server))