2016-07-16 3 views
1

Я пытаюсь создать блестящее приложение. У меня 3 таблицы в базе данных. Приложение будет извлекать таблицы данных из MySQL и всплывать в веб-интерфейсе. В функции ui упоминаются все варианты. При извлечении данных из моего MySQL я три раза читал команду для чтения. Есть ли возможность извлекать данные из одного заявления для чтения?Как получить прочитанные данные в таблицах от mysql до блестящих

library(shiny) 

# Define UI for dataset viewer application 
ui<-fluidPage(

    # Application title. 
    titlePanel("More Widgets"), 

    sidebarLayout(
    sidebarPanel(
     selectInput("dataset", "Choose a dataset:", 
        choices = c("table1", "table2","table3")), 

     numericInput("obs", "Number of observations to view:", 10), 

     submitButton("Update View") 
    ), 

    mainPanel(

     h4("Observations"), 
     tableOutput("view") 
    ) 
) 
) 

# Define server logic required to summarize and view the 
# selected dataset 
server<-function(input, output) { 

    conn <- dbConnect(drv = RMySQL::MySQL(),dbname = "xxx",host = "localhost", 
    username = "root",password = "yyy") 
    on.exit(dbDisconnect(conn), add = TRUE) 
    table1<- dbReadTable(conn = conn, name = 'table1', value = as.data.frame(table1)) 
    table2<- dbReadTable(conn = conn, name = 'table2', value = as.data.frame(table2)) 
    table3<- dbReadTable(conn = conn, name = 'table3', value = as.data.frame(table3)) 

    # Return the requested dataset 
    datasetInput <- reactive({ 
    switch(input$dataset, 
      "table1" = table1, 
      "table2" = table2, 
     "table3" = table3 
      ) 
    }) 

    # Show the first "n" observations 
    output$view <- renderTable({ 
    head(datasetInput(), n = input$obs) 
    }) 
     on.exit(dbDisconnect(conn), add = TRUE) 

} 
shinyApp(ui, server) 

ответ

0

for() функция может работать:

data <- c('table1', 'table2', 'table3') 

list_data <- list() 

for(i in 1:length(data)) {list_data[i] <- dbReadTable(conn = conn, name = data[i], value = as.data.frame(table1))} 
0

Если таблицы не очень большие, вы можете выбрать для более легкого решения, а именно, заменив выход $ вид с следующим

output$view <- renderTable({ 
    head(dbReadTable(conn = conn, name = input$dataset), n = input$obs) 
}) 

Этот код не кэширует таблицы, как ваш код, но намного проще. Однако, если таблицы в базе данных не очень большие, штраф за производительность будет небольшим.

+0

Спасибо большое, всем. Джорис Гиллис, большое спасибо за вашу помощь. Он работает так, как я хочу использовать ваш фрагмент кода :) –

0

Вы можете использовать input $ dataset вместо того, чтобы вручную записывать имя набора данных в оператор dbReadTable.

Примечание: он будет работать нормально, если строки в таблице составляют около 30 000.

Надеюсь, это поможет.

Смежные вопросы