2017-12-28 2 views
1

Ich habe eine kleine glänzende App, die aus einem Datensatz eingelesen wird, und dann die durchschnittliche Zeit pro Element, gruppiert nach Kategorie berechnen. Meine Daten-Set ist eine kompliziertere Version:R glänzend ein bestimmtes Element in einer reaktiven Tabelle zu ändern

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

nach in dieser Datei zu lesen, erzeuge ich eine Tabelle mit den Prozentsatz der Gesamtzeit, die jeder Kategorie zugeordnet. Dieser Teil funktioniert wunderbar.

Kategorie | PercentTime

cat1 | 76.79

cat2 |

23,21

Um die Dinge ein wenig komplizierter zu machen, ich habe ein Eingabefeld, in dem der Benutzer eines gewissen Prozentsatz der Zeit abschätzen kann, dass sie auf einer bestimmten Kategorie verbringen - sollte eine Schätzung auf Zeit erfassen, die nicht in den Daten dargestellt wird einstellen. Dann erzeuge ich eine zweite Tabelle, die berechnet, welche Prozentsätze der Zeit, die jeder Kategorie zugewiesen ist, sind, angepasst um den Prozentsatz der Zeit, die als Teil dieser Kategorie geschätzt wird. Wenn wir Eingang einen Wert von 50% der Zeit in Richtung cat2 gehen, die nicht in den Daten vertreten war, würde ich erwarten, dass die Tabelle geändert werden:

Kategorie | PercentTime

cat1 | 38.39

cat2 | 61,61

wo 61,61 = 11,61 + 50

I derzeit Lage sind, eine Tabelle zu erzeugen, in jeder Kategorie, die aus den korrekten Prozentsatz der Zeit die Zugabe des Benutzereingabeprozentes ausgenommen. Also, was ich bekomme, summiert sich zu weniger als 100%:

Kategorie | PercentTime

cat1 | 38.39

cat2 | 11,61

Ich möchte, dass ein spezifisches Element zwicken PercentTime für cat2 durch den Eingabewert auf die berechnete Zeit Prozent Zugabe, so dass es die richtige Anzahl (61,61).

Shiny App-Code:

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)) 

Ich kann nicht für das Leben von mir herauszufinden, wie meine Benutzereingabe Prozentsatz dieses [Kategorie = cat2, Zeit] Element meiner Tabelle hinzuzufügen. Ich habe versucht:

  • an verschiedenen Orten in der Tabelle Manipulationslogik bewegen, entweder die renderTable Abschnitt, oder es im reaktiven Abschnitt
  • Behandlung meiner generierten Tabelle als etwas mit veränderbaren Elemente zu halten, einen Befehl wie CatTablePlus[CatTablePlus$category == "cat1", "PercentTime"] <- CatTablePlus[CatTablePlus$category == "cat1", "PercentTime"] + input$UnknownPercent[1] verwenden.Je nachdem, wie ich mich diesem Thema annähere, führe ich entweder das Hinzufügen von UnknownPercent [1] zu allen PercentTime-Elementen durch oder erhalte Fehler wie Error: 'row.names' should specify one of the variables in meiner Ausgabe.
  • neue lokale Variablen an der Stelle der reaktiven Tabelle Erstellen von Objekten
  • in verschiedene Arten meine reaktive Tabelle Nötigung wie data.frame

Wie kann ich ein einzelnes Element in einem glänzenden renderTable Objekt einzustellen, reaktiv , wenn ein Benutzer einen numerischen Eingabewert einstellt?

+0

Nur eine schnelle Überprüfung, Haben Sie nur zwei Kategorien haben auch in Ihren Daten? – amrrs

+0

Ich habe fünf Kategorien im eigentlichen Datensatz, und ich modifiziere 2 von diesen 5 letztlich. – omgitsjessie

+0

Dann würde der untenstehende Code gut für den glänzenden Teil funktionieren, aber die Logik für den Fall mit 5 Kategorien muss für die zweite Tabelle aktualisiert werden. Übrigens, hast du den Code ausprobiert? – amrrs

Antwort

0

Ich habe ein paar Änderungen mit Ihrem Code gemacht und auch einen Teil von Ihnen auskommentiert.

  1. Verwendet eventReactive zum Verfolgen der Eingabe numericInput ändern und Rendern Datenrahmen entsprechend.
  2. Angenommen, Sie hätten nur zwei Kategorien, die prozentuale Verschiebungslogik fest codiert.

Aktualisiert Code:

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)) 
+0

Ja !! Das ist perfekt und genau das, was ich brauchte. Vielen Dank! Ich bin mir ziemlich sicher, dass ich es zu hartem Code zu meinen fünf Kategorien erweitern kann. Wird nicht schön sein, aber es wird funktionieren :) – omgitsjessie

+0

Gut zu wissen, dass! – amrrs

Verwandte Themen