R Shiny Как использовать renderPlot для построения диаграммы при извлечении данных из mysqlDB на основе выбора пользователя - PullRequest
1 голос
/ 04 августа 2020

У меня есть набор данных в БД, и на основе выбора пользователя я хотел бы построить гистограмму, используя график рендеринга в r shiny. Мне удалось получить данные и отобразить их в виде таблицы с помощью renderTable, но мне не удалось создать renderPlot. Я также пытаюсь получить данные с сервера в пользовательский интерфейс в виде фрейма данных, в настоящее время я получаю его как dataTable.

PS: Я впервые изучаю R Shiny. Просто пытаюсь понять динамику этого языка.

Вот мой код.

library(DT)
library(shiny)
library(DBI)

# the user interface

ui <- fluidPage(

    titlePanel(strong ("Welcome to User Details")),
    sidebarPanel(

        selectInput("selectedName", label = h5("Select the User name here"),
                    choices = list("A", "B", "C", "D"),
                    selected = "A"),
        submitButton("Submit")
       
),
mainPanel(
    is.data.frame("data"),
    tableOutput("data")
 
)
)

# server
server <- function(input, output){
   
    output$data <- renderTable({
        conn <- dbConnect(
            drv = RMySQL::MySQL(),
            dbname = "mydb",
            host = "localhost",
            port = 3306,
            username = "root",
            password = "pwd")
        on.exit(dbDisconnect(conn), add = TRUE)
        dbGetQuery(conn, paste0(
            "Select name, age, gender from table1 Where userShortName = '", intput$selectedName, "';")
    })
}

# app launch
shinyApp(ui = ui, server = server)

И вывод создаст False (для фрейма данных) и создаст таблицу с этими именами трех столбцов , возраст, пол.

Я пытаюсь построить простой столбчатый график, основанный на имени и возрасте, сгруппировав полы. имя на оси X, возраст на оси Y, и все женщины сгруппированы, все мужчины сгруппированы вместе.

Обновление:

Попытка с renderplot вместо renderTable

    library(DT)
    library(shiny)
    library(DBI)
    
    ui <- fluidPage(

    titlePanel(strong ("Welcome to User Details")),
    sidebarPanel(

        selectInput("selectedName", label = h5("Select the User name here"),
                    choices = list("A", "B", "C", "D"),
                    selected = "A"),
        submitButton("Submit")

),
    mainPanel(
        textOutput("sample_name"),
        plotOutput(outputId = "protein_data")
    ))
    
    # server
    server <- function(input, output){
       
        conn <- dbConnect(
            drv = RMySQL::MySQL(),
            dbname = "mydb",
            host = "localhost",
            port = 3306,
            username = "root",
            password = "pwd")
       
        output$data <- renderPlot({
           
           
            table <- dbGetQuery(conn, statement = "Select name, age, gender from table1 Where userShortName = '", intput$selectedName, "';")
           
            df <- as.data.frame(unclass(table(table$name,
                                               table$age)))
            
            barplot(x=table$name, y=table$age)
        })
    }
    
    # app launch
    shinyApp(ui = ui, server = server)

Этот код дает мне следующую ошибку: Ошибка: нужны блестящие конечные значения xlim.

Ответы [ 2 ]

1 голос
/ 12 августа 2020

Сохранение вашего запроса в таблице и преобразование этой таблицы в фрейм данных. Для построения гистограммы используйте методы renderplotly и plotly.

library(DT)
library(shiny)
library(DBI)
library(plotly) # use plotly library here

# the user interface

ui <- fluidPage(

    titlePanel(strong ("Welcome to User Details")),
    sidebarPanel(

        selectInput("selectedName", label = h5("Select the User name here"),
                    choices = list("A", "B", "C", "D"),
                    selected = "A"),
        submitButton("Submit")       
),
mainPanel(
    is.data.frame("data"),
    tableOutput("data")
 
)
)

server

server <- function(input, output){
   
    output$data <- renderPlotly({

        conn <- dbConnect(
            drv = RMySQL::MySQL(),
            dbname = "mydb",
            host = "localhost",
            port = 3306,
            username = "root",
            password = "pwd")
        on.exit(dbDisconnect(conn), add = TRUE)
        table <- dbGetQuery(conn, paste0(
            "Select name, age, gender from table1 Where userShortName = '", input$selectedName, "';")
         
        # converting table into dataframes, easy to plot
        table1 <- as.data.frame(table)

        # Barplot using plotly
        plot_ly(data=table1,x=~name, y=~age, type="bar")%>%
            layout(
                title = "Title of Barplot",
                xaxis = list(title="Name"),
                yaxis = list(title="Age")
            )
    })
}

# app launch
shinyApp(ui = ui, server = server)
1 голос
/ 04 августа 2020

Сначала вам нужно отобразить диаграмму в output$protein_data, а не в output$data, так как она больше не существует во втором скрипте.

Затем измените аргументы диаграммы на barplot(age~name, data = df)

library(DT)
library(shiny)
library(DBI)

ui <- fluidPage(
  
  titlePanel(strong ("Welcome to User Details")),
  sidebarPanel(
    
    selectInput("selectedName", label = h5("Select the User name here"),
                choices = list("A", "B", "C", "D"),
                selected = "A"),
    submitButton("Submit")
    
  ),
  mainPanel(
    textOutput("sample_name"),
    plotOutput(outputId = "protein_data")
  ))

# server
server <- function(input, output){
  
  conn <- dbConnect(
    drv = RMySQL::MySQL(),
    dbname = "mydb",
    host = "localhost",
    port = 3306,
    username = "root",
    password = "pwd")
  
  output$protein_data <- renderPlot({
    
    
    table <- dbGetQuery(conn, statement = "Select name, age, gender from table1 Where userShortName = '", intput$selectedName, "';")
    
    df <- as.data.frame(unclass(table(table$name,
                                      table$age)))
    
    barplot(age~name, data = df)
  })
}

# app launch
shinyApp(ui = ui, server = server)
...