我正在创建一个应用程序,该应用程序将从用户那里获取动态输入,并且应该生成条形图和折线图。为了获得适当的条形百分比,我觉得我需要总结我的数据。由于我的数据很大,我正在使用 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)
但是当我运行这段代码时,它给了我错误 -错误:“by”或“keyby”列表中的项目是长度(100)。每个必须与 x 中的行长度或 i (6) 返回的行数相同。
如何创建一个反应性 data.table 以便我可以使用它来生成我的条形图和线图。我们不能在 i,j 和 data.table 的一部分中传递动态变量吗?
请推荐!!