Проблемы с реактивным вводом в ShinyDashboard

Я использую следующий набор данных: https://docs.google.com/spreadsheets/d/1C_P5xxzYr7HOkaZFfFiDhanqDSuSIrd2UkiC-6_G2q0/edit#gid=0

Я использую ShinyDashboard, и у меня есть selectInput, который позволяет мне выбирать определенный тип батончика Candy (в столбце Candy в моем наборе данных).

Как мне выбрать этот выбор Candy, а затем построить график, содержащий частоту для этого выбранного шоколадного батончика для каждого месяца покупки? В моем server.R я не уверен, что должно быть в этом CandyCount реактивном элементе.

Мой код выглядит следующим образом:

## ui.R ##
library(shinydashboard)
library(rCharts)


dashboardPage(
  dashboardHeader(title = "Dashboard"),

  dashboardSidebar(
    width = 150,
    sidebarMenu(
      menuItem("Dashboard", tabName = "dashboard", icon = icon("bar-chart"))
    )
    ),

  dashboardBody(
    sidebarPanel(
      htmlOutput("candy")
    ),
    mainPanel(
      showOutput("plot2", "polycharts")
    )))

##server.R##
server <- function(input, output, session) { 


  output$candy<- renderUI({
    selectInput(
      inputId = "candy",
      label = "Candy: ",
      choices = as.character(unique(dataset$Candy)),
      selected = "Twix"
    )
  })


    output$plot2 <- renderChart2({
    candySelect<- input$candy
    df <- dataset[dataset$candy == candySelect,]
    p2 <- rPlot(freq~purchase_month, data = df, type = 'line')
    p2$guides(y = list(min = 0, title = ""))
    p2$guides(y = list(title = ""))
    p2$addParams(height = 300, dom = 'chart2')
    return(p2)
  })


  }

person Gary    schedule 16.10.2015    source источник
comment
используйте переменную, чтобы сохранить выбранную конфету, candyChosen <- input$candy, затем отфильтруйте свой dataset по этой выбранной конфете.   -  person tospig    schedule 16.10.2015
comment
Должно ли все это происходить внутри элемента reactive?   -  person Gary    schedule 16.10.2015
comment
не обязательно. вы можете сделать это внутри renderPlot функции, например: output$candyPlot <- renderPlot({ candyChosen <- input$candy; <filter data and create plot> })   -  person tospig    schedule 16.10.2015
comment
тогда каждый раз, когда intput$candy изменяется, график будет обновляться   -  person tospig    schedule 16.10.2015
comment
ОК, круто. И как вы предлагаете фильтровать данные? Могу ли я использовать rPlot?   -  person Gary    schedule 16.10.2015
comment
Вы можете использовать любой метод, который вам нравится. Если у вас есть тот, который работает в «нормальном» R пространстве с использованием rPlot, вы можете использовать тот же код в блестящем приложении.   -  person tospig    schedule 16.10.2015
comment
Хорошо, я изменил свой исходный код. Вы можете объяснить, почему мое решение не работает? Диаграмма не отображается.   -  person Gary    schedule 16.10.2015
comment
Давайте продолжим это обсуждение в чате.   -  person tospig    schedule 16.10.2015


Ответы (1)


Если вы согласны с использованием ggplot, вы можете сделать что-то вроде этого:

Отредактировано для использования динамической всплывающей подсказки

## ui.R ##
library(shinydashboard)
library(shinyBS)
require(ggplot2)

dataset <- read.csv("Sample Dataset - Sheet1.csv")

ui <- dashboardPage(
  dashboardHeader(title = "Dashboard"),

  dashboardSidebar(
    width = 150,
    sidebarMenu(
      menuItem("Dashboard", tabName = "dashboard", icon = icon("bar-chart"))
    )
  ),

  dashboardBody(
    sidebarPanel(
      htmlOutput("candy")
    ),
    mainPanel(
      uiOutput("plotUI")
    )
  ))

##server.R##
server <- function(input, output, session) { 

  output$candy<- renderUI({
    selectInput(
      inputId = "candy",
      label = "Candy: ",
      choices = as.character(unique(dataset$Candy)),
      selected = "Twix"
    )
  })

  output$plotUI <- renderUI({
    if(is.null(input$candy)) return(NULL)
    local({
      candySelect <- input$candy
      str1 <- sprintf("The candybar you selected is: %s",candySelect)
      str2 <- sprintf("More about %s <a>here</a>",candySelect)
      print (str1)
      popify(plotOutput('plot'),str1,str2)
    })

  }) 

  observeEvent(input$candy,{
    if(is.null(input$candy)) return(NULL)
    candySelect<- input$candy
    print ('plot')
    # Assuming only one entry for each mont per candybar
    d <- dataset[dataset$Candy==candySelect,]
    output$plot <- renderPlot({
      ggplot(data=d, aes(x=purchase_month,y=freq,group=Candy)) + 
      geom_line() + 
      ggtitle(candySelect)
    })
  })

}

shinyApp(ui = ui, server = server)

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

person RmIu    schedule 16.10.2015
comment
Сработало отлично. Спасибо, Оскар! Как мне добавить интерактивные всплывающие подсказки к этому графику ggplot? - person Gary; 16.10.2015
comment
Большой! Я добавил динамически генерируемую подсказку, которая, надеюсь, сработает. - person RmIu; 16.10.2015
comment
@OskarForsmo Это действительно правильно работает? Я просто пробую его на своем RStudio и вижу ситуацию, когда Popover текст появляется каждую секунду, т.е. когда я меняю Twix- ›KitKat появляется Popover, затем, когда я меняю KitKat -› Herskley a Popover не появляется и т. Д. - person Nicolabo; 23.01.2016
comment
Я отредактировал свой ответ, чтобы использовать renderUI и функцию popify, похоже, это работает лучше. - person RmIu; 25.01.2016