Shiny R назначьте переменную на основе выпадающего списка, используя столбец data.frame, и передайте эту переменную для построения графика для визуализации - PullRequest
0 голосов
/ 17 февраля 2020

У меня есть data.frame из моей БД, и я пытаюсь создать R Shiny Web App, в котором я мог бы выбрать из двух выпадающих меню (на основе значений из комбинации строки и столбца в моем data.frame) и передаем эти переменные плотно

Допустим, у меня есть эти данные в моем фрейме данных:

# |User|N00   |Percentage|N01 |
  |----|------|----------|----|
  |35  |2229  | 4.46830  |918 |
  |37  |153   | 0.00307  |0   |
  |39  |1557  | 0.03120  |0   |
  |41  |4997  | 0.10014  |0   |
  |42  |1     | 0.00002  |0   |
  |44  |12221 | 0.24490  |0   |
  |46  |5     | 0.00010  |0   |
  |50  |342   | 0.00685  |0   |
  |51  |123   | 0.00246  |0   |
  |56  |2     | 0.00004  |1   |
  |57  |0     | 0.00000  |0   |
  |60  |62275 |1.24796   |2799|

Что я хотел бы сделать, это иметь один выпадающий список со значениями в столбце «Пользователь» и второй выпадающий список с заголовками, чтобы я мог выбрать «Пользователь» и «Заголовок» и получить соответствующий результат (data.frame).

Итак, что мне нужно из комбинации двух выпадающих меню, так это сделать что-то вроде этого:

select(data_to_choose_from, User, values)[data_to_choose_from$id==values2, ]

Где values ​​- это результат первого раскрывающегося списка (пользователь), а values2 - результат второго раскрывающегося списка (заголовки), который выглядит следующим образом:

enter image description here

Поэтому, когда я выбираю, например, пользователя "35" и столбец "N00", я хотел бы получить такой результат:

 |User|N00   |
 |----|------|
 |35  |2229  |

После того, как я получу этот результат я хотел бы передать число в столбце "N00" в какой-то ва и создайте датчик с этим числом, которое, например, будет выглядеть следующим образом (это просто пример, мне нужно настроить его, чтобы сделать его более «разборчивым»):

enter image description here

У меня есть это:

library(shiny) #Load libraries
library(plotly) #Load libraries

data_to_choose_from <- data.frame(a) #Assign data from data.frame(a), which is data i have from my DB to new variable

ui <- fluidPage(
    sidebarLayout(
        sidebarPanel(
            selectizeInput("User", "User", choices=NULL, selected=NULL), #First dropdown
            selectizeInput("Metrics", "Metrics", choices=NULL, selected=NULL), #Second dropdown
            textOutput("values"), #Show what did i choose in the first dropdown
            textOutput("values2"), #Show what did i choose in the second dropdown
            tableOutput("table") #Output tha table based on my choices in dropdowns
        ),
        mainPanel(
            plotlyOutput('p') #Plot a visualization base on data from output table
        )
    )
)

server <- function(input, output, session) { #First dropdown, reference to my data.frame
    updateSelectizeInput(session, 'User',
                         choices = data_to_choose_from$User,
                         server = TRUE
    )
    updateSelectizeInput(session, 'Metrics',
                         choices = names(data_to_choose_from), #Second dropdown, reference to my data.frame
                         server = TRUE
    )

    output$values <- renderText({(input$User)}) #Output of first dropdown

    output$values2 <- renderText({(input$Metrics)}) #Output of second dropdown

    output$values3 <- as.vector(select(data_to_choose_from, values)[data_to_choose_from$id==values2, ]) #Put this as vector to plot_ly

    output$table <- select(data_to_choose_from, id, values)[data_to_choose_from$id==values2, ] #Filtered data.frame output based on original data

    output$plot <- renderPlotly( #Here i would like to create the plot to render in mainpanel
    p <- plot_ly(
        type = "indicator",
        mode = "gauge+number+delta",
        value = i,
        title = list(text = values2, font = list(size = 24)),
        delta = list(reference = 400, increasing = list(color = "RebeccaPurple")),
        gauge = list(
            axis = list(range = list(NULL, 500), tickwidth = 1, tickcolor = "darkblue"),
            bar = list(color = "darkblue"),
            bgcolor = "white",
            borderwidth = 2,
            bordercolor = "gray",
            steps = list(
                list(range = c(0, values3), color = "cyan"),
                list(range = c(values3, 400), color = "royalblue")),
            threshold = list(
               line = list(color = "red", width = 4),
                thickness = 0.75,
                value = values3 + 100))) %>%
        layout(
            margin = list(l=20,r=30),
            paper_bgcolor = "lavender",
            font = list(color = "darkblue", family = "Arial")))
}
shinyApp(ui, server)

К сожалению, это не работает, я полагаю, мой код неверен с нуля, я пытаюсь следовать документации, но я немного потерян ..

Я пытаюсь изучить R, и я не понимаю, как работают переменные и Shiny R, любая информация, которая помогла бы мне достичь того, чего я хочу, была бы сильно оценена, если что-то неясно, пожалуйста, дайте мне знаю и я отредактирую свой вопрос, спасибо

1 Ответ

0 голосов
/ 20 февраля 2020

Есть несколько проблем.

Когда вы делаете output$values <- renderSomething({......}), вы не можете получить доступ к ......, набрав values (вы даже не можете позвонить output$values).

Замените output$values3 на

  values3 <- reactive({
    req(input$User, input$Metrics)
    data_to_choose_from[data_to_choose_from$User == input$User, input$Metrics]
  })

Теперь вы можете получить значение values3, вызвав values3(). Поэтому замените values3 в вашем renderPlotly на values3(). И замените text = values2 на text = input$Metrics.

Строка req(input$User, input$Metrics) означает, что input$User и input$Metrics должны быть доступны. Это позволяет избежать ошибки при запуске приложения, поскольку эти переменные доступны только после действия updateSelectizeInput.

Если вы хотите визуализировать таблицу, используйте renderTable:

  output$table <- renderTable({
    req(input$User, input$Metrics)
    subset(data_to_choose_from, User == input$User, select = c("User", input$Metrics)) 
  })

Вы делаете output$plot <- renderPlotly({ p <- plot_ly(.......) }), поэтому в вашем ui должно быть plotlyOutput("plot"), а не plotlyOutput("p") , p <- бесполезен, вы можете удалить его.

Теперь в plot_ly вы делаете value = i, но i не определено. Я не знаю, что вы намеревались сделать (я не знаком с такими графиками).

...