2016-12-13 2 views
1

Я создаю приложение, которое будет принимать динамические входы от пользователя и должно генерировать штриховые и линейные диаграммы. Чтобы иметь достаточный процент баров, я чувствую, что мне нужно обобщить мои данные. Поскольку мои данные огромны, я использую 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).

Как создать реактивную таблицу данных, чтобы я мог использовать то же самое, чтобы генерировать мои строки и строки. Не можем ли мы передать динамические переменные в i, j и по части данных. Table?

Пожалуйста, предложите !!

+0

Я могу избавиться от основной ошибки, не используя get(), 'countdd <- mydata [, .N, by = c (input $ rowvar, input $ columnvar)]', график покажет без данных. Я все еще озадачен тем, что вы пытаетесь сделать с propdd. Другими словами, почему вы используете get()? – Dan

+0

@ Дань, да, без получения сюжета нет данных. Это дало мне ощущение, что данные не создаются, и я начал использовать get() post, выполняющий поиск в stackoverflow. Как никогда не получалось сообщения об использовании get.table с Shiny и начали получать эту ошибку. В основном я ищу сюжет, который дал бы проценты за расчет, ** Brand1/Year1 * 100 **, что-то, что даст эта таблица, 'prop.table (таблица (mydata $ Brand, mydata $ Year), 2) '. Есть ли способ получить это без суммирования данных? и да, сюжет должен получить обновленную основу выбранной входной переменной. – user1412

ответ

0

Вы можете использовать символьные векторы (например, input$rowvar) в выражениях data.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 переменная строка и является переменной brand столбец в приложении shiny:

summarized data