R有光泽修改反应表

时间:2017-12-28 01:15:40

标签: r shiny

我有一个小型闪亮的应用程序,旨在从数据集读入,然后计算每个元素的平均时间,按类别分组。我的数据集是一个更复杂的版本:

item time category
apple 13 cat1
bobcat 6 cat2
cement 15 cat1
doomsday 15 cat1
elephant 7 cat2

在阅读该文件后,我生成一个表格,描述归因于每个类别的总时间百分比。这部分工作得非常好。

  

类别| PercentTime

     

cat1 | 76.79

     

cat2 | 23.21

为了使事情复杂化,我有一个输入字段,用户可以估计他们在特定类别上花费的时间百分比 - 用于捕获未在数据集中表示的时间估计。然后,我生成第二个表格,重新计算分配给每个类别的时间百分比,根据估计属于该类别的时间百分比进行调整。如果我们输入50%的时间值,而cat2的数据未在数据中显示,我希望将表格修改为:

  

类别| PercentTime

     

cat1 | 38.39

     

cat2 | 61.61

其中61.61 = 11.61 + 50

我现在能够生成一个表格,其中包含每个类别的正确百分比,不包括添加的用户输入百分比。所以我得到的东西加起来不到100%:

  

类别| PercentTime

     

cat1 | 38.39

     

cat2 | 11.61

我想通过将输入值添加到计算的百分比时间来调整cat2的一个特定PercentTime元素,因此它是正确的数字(61.61)。

闪亮的应用代码:

library(shiny)
library(readxl)
library(dplyr)
library(ggplot2)

ui = fluidPage(
  sidebarPanel(
    fileInput('file1', 'inputtext'),
    numericInput('UnknownPercent', 'labeltext', 50)),

  mainPanel(
    tabsetPanel(type = "tabs",
                tabPanel("tab1", 
                         tableOutput("data_only"),
                         tableOutput("data_inc_unknown_percent"))
    )
  )
)

server = function(input, output) {

  G2T <- reactive({
    if(input$file1 == 0){return()}
    inFile <- input$file1
    if (is.null(inFile)){return(NULL)}

    isolate({ 
      G2T_raw <- read.csv(inFile$datapath)
    })
    G2T_raw
  })

  TotalTime <- reactive({
    if(input$file1 == 0){return()}
    inFile <- input$file1
    if (is.null(inFile)){return(NULL)}

    isolate({ 
      TotalTime <- G2T() %>%
        summarise(TotalTime = sum(time))
      })
    TotalTime
  })

  CatTable <- reactive({
    if(input$file1 == 0){return()}
    inFile <- input$file1
    if (is.null(inFile)){return(NULL)}

    isolate({ 
      TotalTime <- G2T() %>%
        summarise(TotalTime = sum(time))
      CatTable <- G2T() %>%
        group_by(category) %>%
        summarise(PercentTime = sum(time) / TotalTime * 100)
    })
    CatTable
  })

  CatTablePlus <- reactive({
    if(input$file1 == 0){return()}
    inFile <- input$file1
    if (is.null(inFile)){return(NULL)}

    isolate({ 
      TotalTime <- G2T() %>%
        summarise(TotalTime = sum(time))
      CatTablePlus <- G2T() %>%
        group_by(category) %>%
        summarise(PercentTime = ((sum(time) / TotalTime()) * (100 - input$UnknownPercent[1])))
      CatTablePlus <- as.data.frame(CatTablePlus)
    })
    CatTablePlus
  })



  output$data_only <- renderTable({
    req(input$file1)
    CatTable()  
  }) 

  output$data_inc_unknown_percent <- renderTable({
    req(input$file1) 
    CatTablePlus()
  }) 
}
runApp(list(ui = ui, server = server))

我不能为我的生活弄清楚如何将我的用户输入百分比添加到我的表的[category = cat2,time]元素。我试过了:

  • 将表格操作逻辑移动到不同的位置,即renderTable部分,或将其保留在被动部分
  • 使用CatTablePlus[CatTablePlus$category == "cat1", "PercentTime"] <- CatTablePlus[CatTablePlus$category == "cat1", "PercentTime"] + input$UnknownPercent[1]之类的命令将生成的表视为具有可修改元素的内容。根据我的处理方式,我要么执行向所有PercentTime元素添加UnknownPercent [1]的操作,要么在输出中得到Error: 'row.names' should specify one of the variables之类的错误。
  • 在反应表对象的位置创建新的局部变量
  • 将我的反应表强制转换为不同的类型,例如data.frame

当用户调整numericInput值时,如何自动调整Shiny renderTable对象中的单个元素?

1 个答案:

答案 0 :(得分:0)

我已经对您的代码进行了一些更改,并且已经注释掉了您的某些部分。

  1. 使用eventReactive跟踪输入numericInput更改并相应地呈现数据框。
  2. 假设您只有两个类别,硬编码百分比转换逻辑。
  3. 更新代码:

        library(shiny)
    library(readxl)
    library(dplyr)
    library(ggplot2)
    
    ui = fluidPage(
      sidebarPanel(
        fileInput('file1', 'inputtext'),
        numericInput('UnknownPercent', 'labeltext', 50)),
    
      mainPanel(
        tabsetPanel(type = "tabs",
                    tabPanel("tab1", 
                             tableOutput("data_only"),
                             tableOutput("data_inc_unknown_percent"))
        )
      )
    )
    
    server = function(input, output) {
    
      G2T <- reactive({
        if(input$file1 == 0){return()}
        inFile <- input$file1
        if (is.null(inFile)){return(NULL)}
    
        isolate({ 
          G2T_raw <<- read.csv(inFile$datapath)
        })
        G2T_raw
      })
    
      TotalTime <- reactive({
        if(input$file1 == 0){return()}
        inFile <- input$file1
        if (is.null(inFile)){return(NULL)}
    
        isolate({ 
          TotalTime <- G2T() %>%
            summarise(TotalTime = sum(time))
        })
        TotalTime
      })
    
      CatTable <- reactive({
        if(input$file1 == 0){return()}
        inFile <- input$file1
        if (is.null(inFile)){return(NULL)}
    
        isolate({  
          CatTable <- G2T() %>% group_by(category) %>%
            summarise(time = sum(time)) %>% ungroup(category) %>% mutate(time = (time / sum(time))*100)
        })
        CatTable
      })
    
      CatTablePlus <- eventReactive(input$UnknownPercent,{ 
    
    
         # TotalTime <-  G2T() %>%
          #  summarise(TotalTime = sum(time))
    
          # G2T() %>%
          #  group_by(category) %>%
           # summarise(PercentTime = ((sum(time) / TotalTime) * (100 - input$UnknownPercent[1])))
    
        unknownpct_table <- CatTable() 
    
        #unknownpct_table$time[unknownpct_table$category == 'cat2'] <- 100 -  unknownpct_table$time[unknownpct_table$category == 'cat1']
    
        unknownpct_table$time[unknownpct_table$category == 'cat1'] <- unknownpct_table$time[unknownpct_table$category == 'cat1'] -  unknownpct_table$time[unknownpct_table$category == 'cat1'] * (input$UnknownPercent[1] /100)
        unknownpct_table$time[unknownpct_table$category == 'cat2'] <- 100 -  unknownpct_table$time[unknownpct_table$category == 'cat1']
    
        unknownpct_table
    
      })
    
    
    
      output$data_only <- renderTable({
        req(input$file1)
        CatTable()
      }) 
    
      output$data_inc_unknown_percent <- renderTable({
        req(input$file1) 
        CatTablePlus()
      }) 
    }
    runApp(list(ui = ui, server = server))