2017-06-16 10 views
1

Ich habe Probleme mit der Reaktivität in Shiny. In meiner UI habe ichR selectInput Reaktivitätsprobleme

library(tidyverse) 
library(shiny) 
library(forcats) 

ui <- fluidPage(

    titlePanel(h1("Percent Cover")), 

    selectInput("selectInput", "Select Site", choices = c("A", "B", "C", "D")), 


plotOutput("coverTypeBarChart", height = "600px") 

) 

Diese entsprechen den Datenrahmen A, B, C, D, die ich an der Spitze des Servers eingelesen.

In meinem Server, ich habe:

colors <- c("red", "blue", "green", "purple") 



reactive({ 

    if (input$selectInput == "A") 
    {data <- A} 
    else if (input$selectInput == "B") 
    {data <- B} 
    else if (input$selectInput == "C") 
    {data <- C} 
    else if (input$selectInput == "D") 
    {data <- D} 

}) 


    data() <- na.omit(as.data.frame(data()$cover_group)) 
    names(data()) <- c("tmp") 

    cover_group_factor <- as.factor(data()$tmp) 

cover_group_factor <- fct_recode(cover_group_factor, OTHER = "E", OTHER = "F", OTHER = "G", OTHER = "H", OTHER = "I", OTHER = "J", OTHER = "K") 

    bar <- ggplot(data = data()) + 
      geom_bar(mapping = aes(x = cover_group_factor, y = ..count../sum(..count..)), fill = colors) + xlab("Cover Group") + ylab("Percent") 




observe({ 
    output$coverTypeBarChart <- renderPlot(bar) 
     }) 

} 

Ich weiß, wenn ich manuell Daten zu einem des Wert zuweisen und manuell den Code ausführen, ich die Handlung produzieren kann, so dass ich weiß, dass es ein Reaktivität Problem .

Danke.

+0

Ich kann nicht zu viel sagen, da ich keine Beispiele für die Datenrahmen habe. Aus dem, was ich sehe, kann ich jedoch nicht erkennen, dass Sie etwas an Ihre reaktive Funktion angehängt haben. Könnte es sein, dass du Folgendes sagen musst? 'Daten <- reaktiv ({ if (Eingang $ selectInput == "A") {data <- A} else if (Eingang $ selectInput == "B") {data <- B} sonst if (Eingabe $ selectInput == "C") {Daten <- C} sonst if (Eingabe $ selectInput == "D") {Daten <- D} }) ' – p0bs

Antwort

1

musste ich vor kurzem ein ähnliches Problem lösen. Für das folgende Beispiel habe ich einige Daten auf:

library(shiny) 
library(ggplot2) 

set.seed(1) 
A <- sample_frac(mtcars,0.2) %>% select(cyl) 
B <- sample_frac(mtcars,0.2) %>% select(cyl) 
C <- sample_frac(mtcars,0.2) %>% select(cyl) 
D <- sample_frac(mtcars,0.2) %>% select(cyl) 

Hier ist die einfachste Version Ihrer ui, die eine input und output hat:

ui <- fluidPage(
      selectInput("choice", "Select Site", choices = c("A", "B", "C", "D")), 
      plotOutput("barchart", height = "600px") 
    ) 

Der Trick, den ich verwenden, um die Daten abzurufen. Rahmen, den Sie wollen, indem Sie name mit get. Zum Beispiel:

get("A") 

       cyl 
Merc 230   4 
Merc 450SE   8 
Fiat 128   4 
Porsche 914-2  4 
Valiant   6 
Pontiac Firebird 8 

Im Zusammenhang mit server:

server <- function(input, output) { 
       output$barchart <- renderPlot(ggplot(data = get(input$choice), aes(cyl)) + geom_bar()) 
      } 

Wie Sie oben in meiner ggplot Aussage sehen, ich bin das Abrufen der angegebenen Daten von input$choiceget verwenden.

0

Ich stimme mit p0bs überein - Sie müssen das Ergebnis Ihrer reactive Ausdruck einer Variablen zuweisen.

Auch verschachtelte if...else Anweisungen haben eine bestimmte Syntax. else muss in der gleichen Zeile wie die schließenden Klammern der if Anweisung sein.

Hier ist etwas, das funktionieren könnte:

data <- reactive({ 
    if(input$selectInput == "A"){ 
     A 
    } else if(input$selectInput == "B") { 
     B 
    } else if(input$selectInput == "C") { 
     C 
    } else if(input$selectInput == "D") { 
     D 
    } 
}) 
Verwandte Themen