2017-03-21 3 views
1

Ich versuche, Variablen zu verwenden, die unter Daten reactive() erstellt wurden. Folgendes ist mein Code. Es ist ein fertiges BeispielR: Glänzend Verwendung von Variablen unter Daten Reaktiv

UI

library(shiny) 
shinyUI(fluidPage(
titlePanel("Old Data"), 

# Sidebar with a slider input for number of bins 
sidebarLayout(
sidebarPanel(
    selectInput("var", 
       label = "Choose a Group to Display", 
       choices = c("4", "6","8"), 
       selected = "4") 
), 

# Show a plot of the generated distribution 
mainPanel(
    plotOutput("Plot1"), 
    plotOutput("Plot2") 
) 
) 
)) 

SERVER

library(shiny) 
library(datasets) 
library(ggplot2) 
cars=mtcars 

shinyServer(function(input, output) { 

data_rec =reactive({  
d=cars[cars$cyl==input$var,] 
d1=d[d$am==0,] 
list(d=d,d1=d1) 
}) 

output$Plot1 <- renderPlot({ 
data2=data_rec() 
ggplot(data2$d,aes(x=gear,y=wt))+geom_boxplot() }) 

output$Plot2 <- renderPlot({ 
ggplot(data2$d1,aes(x=gear,y=wt))+geom_boxplot() }) 
}) 

ich nur in der Lage bin verwenden, 1 Diagramm für den anderen erstelle ich einen Fehler erhalte: Objekt ‚Data2‘ nicht gefunden. Hilf mir dabei, Variablen innerhalb von reaktiven Daten zu definieren und sie dann zu plotten.

+0

Würde helfen, wenn Sie andere Wörter fanden, um Ihre "Daten" zu nennen. Es wird ziemlich verwirrend. –

+0

Reactives teilen keinen Kontext. Das 'data2', das Sie im 'plot1' renderPlot-Block definiert haben, ist nicht im' Plot2'-Block definiert. –

+0

Ich habe diese Verwirrung entfernt, bitte helfen Sie mit Ihrem zweiten Kommentar –

Antwort

2

Ich denke, es gibt einige Verwirrung darüber, wie Variablen hier begrenzt sind. data2 ist nicht im Codeblock output$plot2 definiert und teilt keine Definitionen mit den im Codeblock output$plot1 definierten Definitionen.

Ich denke, das tut, was Sie wollen, obwohl ich eine reactiveValues für data_rec verwendet hätte.

library(shiny) 
library(datasets) 
library(ggplot2) 

u <- shinyUI(fluidPage(
    titlePanel("Old Data"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
    sidebarPanel(
     selectInput("var", 
        label = "Choose a Group to Display", 
        choices = c("4", "6","8"), 
        selected = "4") 
    ), 

    # Show a plot of the generated distribution 
    mainPanel(
     plotOutput("Plot1"), 
     plotOutput("Plot2") 
    ) 
) 
)) 


cars=mtcars 

s <- shinyServer(function(input, output) { 

    data_rec =reactive({  
    req(input$var) 
    d=cars[cars$cyl==input$var,] 
    d1=d[d$am==0,] 
    list(d=d,d1=d1) 
    }) 

    output$Plot1 <- renderPlot({ 
    data2=data_rec() 
    ggplot(data2$d,aes(x=gear,y=wt))+geom_boxplot() 
    }) 

    output$Plot2 <- renderPlot({ 
    data2=data_rec() 
    ggplot(data2$d1,aes(x=gear,y=wt))+geom_boxplot() 
    }) 
}) 
shinyApp(u,s) 

wodurch man

enter image description here

+0

Eine schnelle Frage, kann ich nur 1 oder eine Variable in der Liste auflisten, und es hängt von der Variablen ab. Wird es funktionieren? Also für ein Beispiel Daten = reaktiv ({a = 2^2, b = a^2 Liste (b = b)}) und dann nur mit b nur für Plot –

2

Sie haben vergessen, Ihre Daten in output$Plot2 zu erstellen.

Es sollte wie folgt aussehen:

output$Plot2 <- renderPlot({ 
       data2 <- data1() 
       data2$d1 %>% 
        ggplot + 
        aes(x = gear,y = wt) + 
        geom_boxplot() 
}) 

Sie auch die reaktiven Teile direkt in den renderPlot Funktionen setzen könnte und vermeiden Listen mit ggplot arbeiten zu müssen ...

Der Server-Teil aussehen würde, dieses:

server <- shinyServer(function(input, output) { 
      output$Plot1 <- renderPlot({ 

      data %>% 
       filter(cyl == input$var) %>% 
       ggplot + 
       aes(x = gear, y = wt) + 
       geom_boxplot() 
      }) 

     output$Plot2 <- renderPlot({ 

      data %>% 
       filter(cyl == input$var & am == 0) %>% 
       ggplot + 
       aes(x = gear,y = wt) + 
       geom_boxplot() 
      }) 
}) 
+0

Schöne Lösung. Ich denke, ein "reactiveValues" würde jedoch eine flexiblere Struktur ergeben. –