尝试使用SelectInput对数据帧求和

时间:2018-07-26 21:48:21

标签: r shiny

重新整理我的问题,我试图用selectinput = c(“ col_1”,“ col_2”,“ col_3”,“ col_4”,“ col_5”)反应性地合成数据帧

我的数据框看起来像这样
日期。 Store_ID。销售部。股票 。 ETC

我需要能够对同一存储中的所有数据进行汇总,并由用户选择不同的列。

以mtcars数据框为例,我的目标是拥有一个这样的表

SelectInput =显示
圆柱-显示
4-总和(每4个缸显示)
6-总和(每6个气缸显示)
8-总和(每8个圆柱显示)

SelectInput = qsec
圆柱体。 qsec
4。总和(每4缸qsec)
6。总和(每6缸qsec)
8。总和(每8个圆柱每秒钟qsec)

library(shiny)

图书馆(tidyverse)

ui <- bootstrapPage(
  selectInput(
    "col",
    "Column",
    colnames(mtcars),
    selected = "mpg"),
  plotOutput("histCentile", height = 200)
)

server <- function(input, output) {
  data <- reactive({
    mtcars() %>%
      group_by(cyl = cyl) %>%
      pull(input$col) %>%
      sum()
  })

  output$histCentile <- renderPlot({
    hist(data()$[[input$col]],
         main = "Graph",
         xlab = "Units",
         xlim = range(data()$[[input$col]]),
         col = '#00DD00',
         border = 'white')
  })
}

# Run the application
shinyApp(ui = ui, server = server)

2 个答案:

答案 0 :(得分:0)

我不确定您要做什么,但这是一个使用reactive来基于selectInput变量过滤数据的可复制示例。

library(shiny)
library(tidyverse)

ui <- bootstrapPage(
    selectInput(
        "col",
        "Column",
        colnames(mtcars),
        selected = "mpg"),
    textOutput("selected_col")
)

server <- function(input, output) {
    data <- reactive({
        mtcars %>% pull(input$col) %>% sum()
    })

    output$selected_col <- renderText({
        sprintf("The sum of column %s is %f", input$col, data())
    })
}

# Run the application
shinyApp(ui = ui, server = server)

说明:在data中,我们基于input$col的选择求和来自selectInput的值。因此,data是一个无功值,我们在output$selected_col中显示。


更新

更新后的代码示例存在一些问题:

  1. reactive块中,您正在汇总数据以给出一个数字。根据单个数字绘制直方图没有任何意义。其次,有一个错字:应该是mtcars而不是mtcars();最后,group_by(cyl = cyl)是不必要的,因为您以后无需再进行任何分组计算(它也应该是group_by(cyl))。
  2. 实际上您根本不需要reactive块,因为您可以直接在renderPlot中进行过滤,但是我想这是个人喜好。

以下内容基于selectInput

中的选定列动态更新直方图
library(shiny)
library(tidyverse)

ui <- bootstrapPage(
    selectInput(
        "col", 
        "Column", 
        colnames(mtcars),
        selected = "mpg"),
    plotOutput("histo")
)

server <- function(input, output) {
    data <- reactive({
        mtcars %>% pull(input$col)
    })

    output$histo <- renderPlot({
        hist(data())
    })
}

# Run the application 
shinyApp(ui = ui, server = server)

答案 1 :(得分:0)

更新-解决方案

感谢莫里斯·埃弗斯的帮助和一些研究,我设法做到了自己想做的

library(shiny)
library(tidyverse)

ui <- bootstrapPage(
  selectInput(
    "col", 
    "Column", 
    colnames(mtcars),
    selected = "mpg"),
  plotOutput("histo")
)

server <- function(input, output) {

  data <- reactive({
    Graphby <- input$col
    with(mtcars,aggregate(qsec,list(cyl=cyl),sum))
    aggregate(mtcars[[Graphby]],list(cyl=mtcars$cyl),sum) 

  })

  output$histo <- renderPlot({
    hist(data()$x)
  })
}



# Run the application 
shinyApp(ui = ui, server = server)

它的工作原理是通过合并this之类的数据组来实现交互式直方图 通过选择不同的列以反应的方式。