R Shiny selectInput реактивность с несколькими переменными выходными - PullRequest
0 голосов
/ 28 января 2020

Мне нужна помощь в решении проблемы с приборной панелью. По сути, у меня есть единственное меню selectInput, однако я хочу иметь возможность выбрать несколько переменных и вывести их все на один и тот же график.

В данный момент я могу заставить его построить одну выбранную переменную на графике. .ly график, однако, даже когда я выбираю несколько переменных, он все равно будет отображать только первую выбранную переменную:

текущий вывод одной переменной enter image description here

Дополнительно, когда приложение запускается впервые, я получаю эту ошибку до тех пор, пока вручную не выберу переменную:

ошибка, полученная при первом отображении enter image description here

Это упрощенная версия код, с которым я работаю до сих пор:

global_indices <- read_excel("Market_Data.xlsx", 
                             sheet = 4,
                             col_names = FALSE, 
                             skip = 5)
global_indices_clean <- global_indicies[,c(1,3,7,9,13,21,23)]
colnames(global_indices_clean) <- c("Date", "Australia", "US", "UK", "Germany", "Japan", "Hong_Kong")
global_indices_2y2 <- global_indices_clean %>% filter(between(Date, now() - years(2), now()))


header <- dashboardHeader(
  title = "Dashboard"
)

sidebar <- dashboardSidebar(
  sidebarMenu(
    menuItem("Global Indices",
             tabName = "global_indices")
  )
)

body <- dashboardBody(
  tabItems(
    tabItem(tabName = "global_indices",
            fluidRow(
              box(plotlyOutput("plot_3"), title = "Developed indices", status = "primary", width = 4, ""),
              box(plotlyOutput(""), title = "", status = "primary", width = 4, ""),
              box(plotlyOutput(""), title = "", status = "primary", width = 4, "")
            ),
            fluidRow(
              box(selectInput("global_indices_input", "Indices", 
                              choices = 
                                list("Australia" = "Australia", 
                                     "US" = "US",
                                     "UK" = "UK", 
                                     "Germany" = "Germany",
                                     "Japan" = "Japan",
                                     "Hong Kong" = "Hong_Kong"),
                              multiple = TRUE), 
                  width = 4)
            )
    )
  )  
)


ui <- dashboardPage(
  header,
  sidebar,
  body
)


server <- function(input, output) {


  output$plot_3 <- renderPlotly({
    plot_3 <- plot_ly(
      global_indices_2y2, x = global_indices_2y2$Date, y = ~get(input$global_indices_input), type="scatter", mode="lines"
    )
  })

}

shinyApp(ui, server)

Я не могу предоставить сам набор данных, однако ниже приведен небольшой его раздел:

> str(global_indices_2y2)
'data.frame':   478 obs. of  7 variables:
 $ Date     : POSIXct, format: "2018-01-29" "2018-01-30" "2018-01-31" "2018-02-01" ...
 $ Australia: num  107 106 106 107 108 ...
 $ US       : num  113 112 112 112 110 ...
 $ UK       : num  104 103 102 102 101 ...
 $ Germany  : num  103.9 102.9 102.8 101.4 99.7 ...
 $ Japan    : num  116 114 113 115 114 ...
 $ Hong_Kong: num  120 118 119 118 118 ...

Я прочитал за последние несколько дней здесь работали десятки потоков, однако все они, похоже, сосредоточены на проблемах, связанных с несколькими параметрами selectInput, а не с одним selectInput, требующим возможности выбора и отображения нескольких iple выходы.

Буду признателен за любую помощь, которую вы сможете оказать!

1 Ответ

0 голосов
/ 28 января 2020

Один из подходов заключается в создании отдельного reactive для фильтрации ваших данных и использования отфильтрованных данных на вашем графике. Во-первых, я хотел бы рассмотреть возможность преобразования ваших данных в длинный формат (например, используя tidyverse pivot_longer). Например:

global_indices_2y2 <- data.frame(
  Date = as.POSIXct(c("2018-01-29", "2018-01-30", "2018-01-31", "2018-02-01")),
  Australia = c(107, 106, 106, 107),
  US = c(113,112,112,112),
  UK = c(104,103,102,102)
) %>%
  pivot_longer(cols = -Date, names_to = "country", values_to = "index")

Затем добавьте reactive для фильтрации по нескольким выборкам в вашем server:

mydata <- reactive({
  global_indices_2y2 %>%
    filter(country %in% input$global_indices_input)
})

Затем постройте отфильтрованные данные:

output$plot_3 <- renderPlotly({
  plot_3 <- plot_ly(
    mydata(), 
    x = ~Date, 
    y = ~index, 
    name = ~country,
    type="scatter", 
    mode="lines"
  )
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...