闪亮动态创建反应数据。基础选择变量

时间:2016-12-13 18:27:05

标签: r ggplot2 shiny data.table summarize

我正在创建一个应用程序,它将从用户那里获取动态输入,并应生成条形图和折线图。为了得到适当百分比的酒吧,我觉得我需要总结一下我的数据。由于我的数据很大,我使用的是data.table。

我要找的是在行中选择的变量应该是我的x轴,y轴应该用于计算百分比(分母)。比例为100%。我已经创建了一个示例数据来描述这种情况。

以下是我正在使用的Shiny代码 -

library("shiny")
library("ggplot2")
library("scales")
library("data.table")
library("plotly")

Location <- sample(1:5,100,replace = T)
Brand <- sample(1:3,100,replace = T)
Year <- rep(c("Year 2014","Year 2015"),50)
Q1 <- sample(1:5,100,replace = T)
Q2 <- sample(1:5,100,replace = T)

mydata <- as.data.table(cbind(Location,Brand,Year,Q1,Q2))

ui <- shinyUI(fluidPage(
  sidebarPanel(
    fluidRow(
      column(10,
             div(style = "font-size: 13px;", selectInput("rowvar", label = "Select Row Variable", ''))
      ),
      tags$br(),
      tags$br(),
      column(10,
             div(style = "font-size: 13px;", selectInput("columnvar", "Select Column Variable", ''))
      ))

  ),
  tabPanel("First Page"),
  mainPanel(tabsetPanel(id='charts',
                        tabPanel("charts",tags$b(tags$br("Graphical Output" )),tags$br(),plotlyOutput("plot1"))
  )
  )
))

server <- shinyServer(function(input, output,session){
  updateTabsetPanel(session = session
                    ,inputId = 'myTabs')

  observe({
    updateSelectInput(session, "rowvar", choices = (as.character(colnames(mydata))),selected = "mpg")
  })

  observe({
    updateSelectInput(session, "columnvar", choices = (as.character(colnames(mydata))),selected = "cyl")
  })

  output$plot1 <- renderPlotly({
    validate(need(input$rowvar,''),
             need(input$columnvar,''))
countdd <- mydata[,.N,by=.(get(input$rowvar),get(input$columnvar))]
sumdd <- countdd[,sum(N),get(input$columnvar)]
propdd <- countdd$N/sumdd$V1[match(paste0("countdd$",get(input$columnvar)),paste0("sumdd$",get(input$columnvar)))]
countdd$prop <- round(propdd*100,2)

ggplot(countdd,aes(x=get(input$rowvar),y=prop)) + geom_bar(stat = 'sum')

  })

})

shinyApp(ui = ui, server = server)

但是当我运行此代码时,它会给我错误 - 错误: &#39; by&#39;中的项目或者&#39; keyby&#39;列表是长度(100)。每个必须与x中的行或i(6)返回的行数相同。

如何创建一个反应式data.table,以便我可以使用它来生成我的条形图和线图。我们不能在i,j和部分data.table中传递动态变量吗?

请建议!!

1 个答案:

答案 0 :(得分:0)

您可以通过input$rowvardata.table表达式中使用字符向量(例如eval())。如果您想要一个汇总prop.table(table(mydata$Brand,mydata$Year),2)等数据的图表,以便所有三个品牌的总和每年总计1个:

    Year 2014 Year 2015
  1      0.48      0.38
  2      0.24      0.32
  3      0.28      0.30

然后试试这个(总数是100):

  output$plot1 <- renderPlotly({
    validate(need(input$rowvar,''),
             need(input$columnvar,''))
    countdd <- mydata[, .(n = .N), by = eval(c(input$rowvar, input$columnvar))]
    sumdd <- countdd[, .(total = sum(n, na.rm = TRUE)), by = eval(c(input$rowvar))]
    setkeyv(countdd, input$rowvar)
    setkeyv(sumdd, input$rowvar)
    propdd <- sumdd[countdd]
    propdd[, proportion := round(100 * n / total, 2)]
    ggplot(propdd, aes_string(x = input$rowvar, y = "proportion",
      fill = input$columnvar)) + geom_bar(stat = 'sum')
  })
year是行变量且brandshiny应用中的列变量时,

生成此图:

summarized data