2017-04-18 1 views
1

Ich möchte eine Anwendung mit R shiny Paket zu produzieren. Ich möchte ggplots von einem anderen Projekt hochladen und interaktiven Inhalt hinzufügen.R Shiny: Fehler, wenn interaktive Eingabe in eine ggplot aus rds-Datei geht (Fehler in eval: Objekt 'x' nicht gefunden)

Wenn ich einen Datenpunkt mit geom_point() zu einem ggplot hinzufüge, der in demselben R-Code erstellt wurde, funktioniert das gut. Wenn ich den ggplot jedoch erneut speichere und erneut lese (*), tritt ein Fehler auf. Ich könnte noch die geom_point (**) hinzufügen, aber es akzeptiert nicht den interaktiven Inhalt von input$slider.

ui.R

library(shiny) 

shinyUI(

    fluidPage(

    # Title 
    titlePanel(""), 

    # sidebar 
    sidebarLayout(

     sidebarPanel("", 
        sliderInput("slider", "slider", 
           min = 100, max = 500, value = 300, step = 10) 
    ), 

     # Main 
     mainPanel("", 

       plotOutput("ggplt") 
    ) 
    ) 
) 
) 

server.R

library(shiny) 

shinyServer(

    function(input, output){ 

    # produce a plot 
    output$ggplt <- renderPlot({ 

     # ggplot scatterplot 
     library(ggplot2) 
     gg <- ggplot(data = mtcars, aes(x = disp, y = mpg)) + 
     geom_point() 

     # (*) save ggplot 
     #saveRDS(gg, "plt.rds") 
     #rm(gg) 
     #gg <- readRDS("plt.rds") 

     # x-coordinate for geom_point 
     xc <- as.numeric(input$slider) 

     gg + geom_point(aes(x = xc, y = 20), size = 5, colour = "red") 

     ## (**) alternative 
     #gg + geom_point(aes(x = 400, y = 20), size = 5, colour = "red") 
    }) 

    } 
) 
+0

siehe http://tagteam.harvard.edu/hub_feeds/1981/feed_items/2104863 – timfaber

Antwort

1

Ich weiß wirklich nicht, was hier vor sich geht, und ich denke, es ist wahrscheinlich einige subtile Interaktion zwischen die Handhabung der ggplot2-Umgebung und die Handhabung der glänzenden reaktiven Umgebung. Es könnte sich lohnen, als Bug zu kennzeichnen.

Es gibt jedoch eine Reihe von Möglichkeiten, um mit kleinen Änderungen zu arbeiten. Ich denke, das Beste ist, eine reaktive Funktion für den Schiebereglerwert zu verwenden, obwohl nur xc mit dem verpönten <<- zuzuweisen scheint auch zu funktionieren und ist eine kleinere Änderung.

Sie könnten auch einfach input$slider direkt in der Funktion als das scheint zu arbeiten, aber die Verwendung einer reaktiven Funktion fühlt sich sauberer an.

So ist das, was ich als Behelfslösung vorschlagen:

library(shiny) 
library(ggplot2) 
u <- shinyUI(
    fluidPage(
    titlePanel(""), 
    sidebarLayout(
     sidebarPanel("", sliderInput("slider", "slider", 
         min = 100, max = 500, value = 300, step = 10) 
    ), 
     mainPanel("", plotOutput("ggplt") 
    ) 
))) 
s <- shinyServer( function(input, output){ 

    sliderval <- reactive({input$slider}) 

    output$ggplt <- renderPlot({ 
     req(input$slider) 

     gg <- ggplot(data = mtcars) + 
     geom_point(aes(x = disp, y = mpg)) 

     # (*) save ggplot 
     saveRDS(gg, "plt.rds") 
     rm(gg) 
     gg <- readRDS("plt.rds") 

     gg + geom_point(aes(x = sliderval(), y = 20), size = 5, colour = "red") 
    }) 
}) 
shinyApp(u,s) 

wodurch man

enter image description here

Verwandte Themen