我有一个小型闪亮的应用程序,旨在从数据集读入,然后计算每个元素的平均时间,按类别分组。我的数据集是一个更复杂的版本:
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]元素。我试过了:
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
之类的错误。当用户调整numericInput值时,如何自动调整Shiny renderTable对象中的单个元素?
答案 0 :(得分:0)
我已经对您的代码进行了一些更改,并且已经注释掉了您的某些部分。
eventReactive
跟踪输入numericInput
更改并相应地呈现数据框。更新代码:
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))