2016-12-13 34 views
1

我正在创建一个应用程序,将采取从用户的动态输入,并应该生成条形图和折线图。为了让酒吧有适当的百分比,我觉得我需要总结我的数据。由于我的数据很大,我正在使用data.table。Shiny动态创建被动data.table基础选定变量

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

下面是我使用的闪亮代码 -

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) 

但是当我运行这段代码它给我的错误 - 错误: 在“通过”或“keyby”列表中的项目是长度(100)。每个元素的长度必须与x中的行或i(6)返回的行数相同。

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

请建议!!

+0

我可以通过不使用get(),'countdd < - mydata [,。N,by = c(输入$ rowvar,输入$ columnvar)]'来摆脱主要错误,图中将显示没有数据。我仍然对你想用propdd做什么感到困惑。换句话说,你为什么使用get()? – Dan

+0

@丹,是的,没有得到阴谋显示没有数据。这让我感觉数据没有被创建,并且我开始使用get()post在stackoverflow上进行一些搜索。如何使用Shiny获得data.table的任何后期使用并开始获取该错误。基本上我正在寻找一个情节,这将给百分比的基础上的计算,**品牌1 /年1 * 100 **,这个表会给,'prop.table(表(mydata $品牌,mydata $ Year),2 )'。有没有一种方法可以在不汇总数据的情况下得到这个结果是的,情节应根据所选的输入变量进行更新。 – user1412

回答

0

您可以通过eval()data.table表达式中使用字符向量(如input$rowvar)。如果您希望总结了象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是行变量和brand处于shiny应用列变量:

summarized data