У меня есть 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 - результат второго раскрывающегося списка (заголовки), который выглядит следующим образом:
Поэтому, когда я выбираю, например, пользователя "35" и столбец "N00", я хотел бы получить такой результат:
|User|N00 |
|----|------|
|35 |2229 |
После того, как я получу этот результат я хотел бы передать число в столбце "N00" в какой-то ва и создайте датчик с этим числом, которое, например, будет выглядеть следующим образом (это просто пример, мне нужно настроить его, чтобы сделать его более «разборчивым»):
У меня есть это:
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, любая информация, которая помогла бы мне достичь того, чего я хочу, была бы сильно оценена, если что-то неясно, пожалуйста, дайте мне знаю и я отредактирую свой вопрос, спасибо