R Shiny - Reactive selectInput数据框列

时间:2016-09-09 15:28:02

标签: r shiny rstudio reactive-programming shinydashboard

我有一个仪表板,可以从Google分析或CSV上传中提取数据,然后计算转化率和平均订单价值(用于AB测试目的)。 我一直在尝试实现允许选择设备类别的过滤器,例如(移动设备,平板电脑或桌面设备)和产品类别,例如(卡,礼品或鲜花)。过滤器应从动态数据帧中拉出,然后在下拉列表中进行选择。 我见过这个论坛的很多类似的例子,但对于我的生活,我还没有能够使它发挥作用。我看到的情况似乎是使用observe({}),但我的问题似乎来自于我需要首先从反应函数中传出选择这一事实。

下面是一个可重现的简化示例,其中会生成数据帧。 我已经在UI中注释了#choices = Results()$ Devices,以便向您展示它在中断之前的样子。

非常感谢提前 ģ

require(shiny)
require(shinydashboard)
require(googleVis)
require(dplyr)


ui <- dashboardPage(  
  skin="blue",

  dashboardHeader(
    title="Dashboard",
    titleWidth = 250

  ),

  dashboardSidebar(


    sidebarMenu(
      menuItem("Calculator ", tabName = "calculator", icon = icon("calculator"))

    )
  ),
  #
  dashboardBody(
    tabItems(
      tabItem(tabName = "calculator",
              h1("Calculator"),


              fluidRow(
                column(width = 1,
                       selectInput("device","Device:",
                                   #choices= Results()$Devices,
                                   multiple=TRUE, selectize=TRUE)
                ),
                column(width = 1,
                       selectInput("product","Product:",
                                   #"choices= Results()$Products",
                                   multiple=TRUE, selectize=TRUE)
                )
              ),

              fluidRow(

                column(width = 6,
                       box(title="Overall Conversion rate %",status="primary",solidHeader = TRUE,
                           htmlOutput("CRABCalcl"),width = "100%",height=275)
                ),

                column(width = 6,
                       box(title="Overall AOV £",status="primary",solidHeader = TRUE,
                           htmlOutput("AOVABCalcl"),width = "100%",height=275)
                )
              ),
              fluidRow(

                column(width = 6,
                       box(title="Ecommerce Conversion rate %",status="primary",solidHeader = TRUE,
                           htmlOutput("CRABCalclEHC"),width = "100%",height=275)
                ),

                column(width = 6,
                       box(title="Ecoomerce AOV £",status="primary",solidHeader = TRUE,
                           htmlOutput("AOVABCalclEHC"),width = "100%",height=275)
                )
              )

          )

      )#End of tab Item
    ) #end of tabItems

  )#End of Dashboard body
)#End of dashboardPage


server <- function(input, output,session) {
  Results <- reactive({

    myDataRAW<-data.frame(
      c("mobile","mobile","desktop","desktop","tablet","tablet"),
      c("Control","Challenger","Control","Challenger","Control","Challenger"),
      c(34355,34917,28577,29534,15337,13854),
      c(15011,15427,32190,32548,40299,40858),
      c(14636,14990,19609,19702,7214,7785),
      c(123273.70,20936.92,45179.05,46359.91,65765.27,92771.36),
      c(10370,13403,19241,26965,4468,8796)
    )

    myDataRAWEHC<-data.frame(
      c("desktop","desktop","mobile","mobile","tablet","tablet","desktop","desktop","mobile","mobile","desktop","desktop","mobile","mobile","tablet","tablet","tablet","tablet","desktop","desktop"),
      c("Card","Card","Card","Card","Card","Card","Card","Card","Gift","Gift","Gift","Card","Card","Card","Card","Card","Card","Card","Flower","Flower"),
      c("Standard","Standard","Standard","Standard","Standard","Standard","Large","Large","Large","Large","Square","Square","Square","Square","Large","Large","Square","Square","Flowers","Flowers"),
      c("Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger"),
      c(8767,18072,5729,13017,2908,7086,1655,2971,1008,2177,984,2369,599,1422,449,1052,402,1001,233,355),
      c(9055,18624,5908,13302,3015,7288,1691,3000,1013,2192,1009,2455,623,1450,455,1068,413,1017,233,356),
      c(21699.60,44480.95,14464.85,32590.30,7232.47,17483.35,8309.85,14684.68,5024.92,10844.67,2405.07,5826.83,1529.16,3556.38,2220.21,5192.92,992.14,2447.78,5196.08,8021.95)
    )

    names(myDataRAW)<-c("Device.Category","Segment","Users","Sessions","Transactions","Revenue","Quantity")
    names(myDataRAWEHC)<-c("Device.Category","Product.Category..Enhanced.Ecommerce.","Product.Variant","Segment","Unique.Purchases","Quantity","Product.Revenue")

    Devices<-myDataRAW$Device.Category
    Products<-unique(myDataRAWEHC$Product.Category..Enhanced.Ecommerce.)
#     DeviceFilter<-input$device
#     ProductFilter<-input$product
    #the below is replacing the above input to act as filters
    DeviceFilter<-c("desktop","mobile")
    ProductFilter<-c("Flower","Gift")
    myData<-myDataRAW %>% filter(Device.Category %in% DeviceFilter)
    myDataEHC<-myDataRAWEHC %>% filter(Device.Category %in% DeviceFilter) %>% filter(`Product.Category..Enhanced.Ecommerce.` %in% ProductFilter)

    myData<-bind_rows(myData,myData %>% group_by(Device.Category="All",Segment) %>% summarise(Users=sum(Users),Sessions=sum(Sessions),Transactions=sum(Transactions),Revenue=sum(Revenue),Quantity=sum(Quantity)))
    myDataEHC<-rbind(myDataEHC %>% group_by(Device.Category,Segment) %>% summarise(Transactions=sum(Unique.Purchases),Quantity=sum(Quantity),Revenue=sum(Product.Revenue)), 
                     myDataEHC %>% group_by(Device.Category="All",Segment) %>% summarise(Transactions=sum(Unique.Purchases),Quantity=sum(Quantity),Revenue=sum(Product.Revenue)) )
    myDataEHC<-left_join(myDataEHC,myData %>% select(Segment,Device.Category,Users,Sessions))
    myData$Analysis<-"Overall"
    myDataEHC$Analysis<-"Ecommerce"
    myDataForAnalysis<-rbind(as.data.frame(myData),as.data.frame(myDataEHC))


    myDataForAnalysis$CVR<-myDataForAnalysis$Transactions/myDataForAnalysis$Sessions
    myDataForAnalysis$AOV<-myDataForAnalysis$Revenue/myDataForAnalysis$Transactions

    DisplayResultsEHC<-myDataForAnalysis %>% filter(Analysis %in% "Ecommerce")
    DisplayResults<-myDataForAnalysis %>% filter(Analysis %in% "Overall")



    list(DisplayResultsEHC=DisplayResultsEHC,DisplayResults=DisplayResults,Devices=Devices,Products=Products)
  })



  output$CRABCalcl <- renderGvis({
    DataABCalcl<-Results()$DisplayResults
    F<-cast(DataABCalcl, Device.Category~Segment, value = 'CVR')
    X<-gvisColumnChart(F,options=list(legend="{position:'top'}",width="100%"))

  })

  output$AOVABCalcl <- renderGvis({
    DataABCalcl<-Results()$DisplayResults
    F<-cast(DataABCalcl, Device.Category~Segment, value = 'AOV')
    X<-gvisColumnChart(F,options=list(legend="{position:'top'}",width="100%"))
  })

  output$CRABCalclEHC <- renderGvis({
    DataABCalcl<-Results()$DisplayResultsEHC
    F<-cast(DataABCalcl, Device.Category~Segment, value = 'CVR')
    X<-gvisColumnChart(F,options=list(legend="{position:'top'}",width="100%"))

  })

  output$AOVABCalclEHC <- renderGvis({
    DataABCalcl<-Results()$DisplayResultsEHC
    F<-cast(DataABCalcl, Device.Category~Segment, value = 'AOV')
    X<-gvisColumnChart(F,options=list(legend="{position:'top'}",width="100%"))
  })


}

shinyApp(ui, server)

1 个答案:

答案 0 :(得分:0)

从我看到一个好的开始是创建一个包含(并从server.R中删除)的global.R文件:

global.R

vi

这允许您从ui.R访问myDataRAW和myDataRAWEHC。相应地修改ui.R:

myDataRAW<-data.frame(
            c("mobile","mobile","desktop","desktop","tablet","tablet"),
            c("Control","Challenger","Control","Challenger","Control","Challenger"),
            c(34355,34917,28577,29534,15337,13854),
            c(15011,15427,32190,32548,40299,40858),
            c(14636,14990,19609,19702,7214,7785),
            c(123273.70,20936.92,45179.05,46359.91,65765.27,92771.36),
            c(10370,13403,19241,26965,4468,8796)
    )

    myDataRAWEHC<-data.frame(
            c("desktop","desktop","mobile","mobile","tablet","tablet","desktop","desktop","mobile","mobile","desktop","desktop","mobile","mobile","tablet","tablet","tablet","tablet","desktop","desktop"),
            c("Card","Card","Card","Card","Card","Card","Card","Card","Gift","Gift","Gift","Card","Card","Card","Card","Card","Card","Card","Flower","Flower"),
            c("Standard","Standard","Standard","Standard","Standard","Standard","Large","Large","Large","Large","Square","Square","Square","Square","Large","Large","Square","Square","Flowers","Flowers"),
            c("Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger","Control","Challenger"),
            c(8767,18072,5729,13017,2908,7086,1655,2971,1008,2177,984,2369,599,1422,449,1052,402,1001,233,355),
            c(9055,18624,5908,13302,3015,7288,1691,3000,1013,2192,1009,2455,623,1450,455,1068,413,1017,233,356),
            c(21699.60,44480.95,14464.85,32590.30,7232.47,17483.35,8309.85,14684.68,5024.92,10844.67,2405.07,5826.83,1529.16,3556.38,2220.21,5192.92,992.14,2447.78,5196.08,8021.95)
    )

    names(myDataRAW)<-c("Device.Category","Segment","Users","Sessions","Transactions","Revenue","Quantity")
    names(myDataRAWEHC)<-c("Device.Category","Product.Category..Enhanced.Ecommerce.","Product.Variant","Segment","Unique.Purchases","Quantity","Product.Revenue")

之后你还有一些工作要重新安排服务器.R部分。