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 wieError: '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?
Nur eine schnelle Überprüfung, Haben Sie nur zwei Kategorien haben auch in Ihren Daten? – amrrs
Ich habe fünf Kategorien im eigentlichen Datensatz, und ich modifiziere 2 von diesen 5 letztlich. – omgitsjessie
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