2017-09-24 3 views
2

Also verwende ich mpg-Datensatz, um meine R-glänzenden Fähigkeiten zu üben, aber ich stieß auf ein Problem.R-glänzend: Diskreter Wert für kontinuierlichen Maßstab

Ich möchte eine App schreiben, die ich verschiedene Variablen wählen konnte, um Graph zu machen, wenn es mindestens eine diskrete Variable beinhaltet, dann zeichne ich einen geom_boxplot, sonst zeichne ich einfach einen geom_point.

Mein ui.R sieht wie folgt aus:

library(shiny) 
library(tidyverse) 
library(dplyr) 

shinyServer(function(input, output) { 

    output$distPlot <- renderPlot({ 

    if(typeof(mpg[, input$var1]) == "chr" || 
     typeof(mpg[, input$var2]) == "chr") 
    { 
     ggplot(data = mpg) + 
     geom_boxplot(mapping = 
          aes(x = mpg[, input$var1], 
           y = mpg[, input$var2])) + 
     xlab(input$var1) + 
     ylab(input$var2) + 
     ggtitle(paste("Plot", input$var1, "vs", input$var2)) 
    } 

    else 
    { 
     ggplot(data = mpg) + 
     geom_point(mapping = 
        aes(x = mpg[, input$var1], 
         y = mpg[, input$var2])) + 
     xlab(input$var1) + 
     ylab(input$var2) + 
     ggtitle(paste("Plot", input$var1, "vs", input$var2)) 
    } 
    }) 
}) 

Aber es funktioniert einfach nicht:

library(shiny) 

shinyUI(fluidPage(

    # Application title 
    titlePanel("Old Faithful Geyser Data"), 

    # Sidebar with a slider input for number of bins 
    sidebarLayout(
    sidebarPanel(
     selectInput(inputId = "var1", 
        label = "Choose x variable", 
        choices = 
        names(mpg) 
    ), 
     selectInput(inputId = "var2", 
        label = "Choose y variable", 
        choices = 
        names(mpg)) 
    ), 

    # Show a plot of the generated distribution 
    mainPanel(
     plotOutput("distPlot") 
    ) 
) 
)) 

Und Meine server.R wie folgt aussieht! Wenn ich eine diskrete Variable wähle, wird eine Fehlermeldung mit der Meldung "Diskreter Wert für kontinuierliche Skalierung" zurückgegeben. Wenn ich jedoch beide kontinuierlichen Wert wähle, scheint es gut zu funktionieren.

Warum zeigt es so eine Fehlermeldung? Bitte helfen Sie mir! Vielen Dank!

Antwort

1

Sie haben ein paar Probleme hier alle auf der Serverseite:

One: Wenn Sie ein Beispiel Ihrer überprüfen typeof Sie werden sehen, dass Sie immer eine Liste erhalten:

typeof(mpg[,"model"]) 
#[1] "list" 
typeof(mpg[,"displ"]) 
#[1] "list" 

Das liegt daran, dass [ das tatsächliche Element nicht extrahiert, sondern die Liste, die dieses Element enthält. Von ?"[":

:

Indizierung durch [ähnelt Atomvektoren und wählt eine Liste der angegebenen Elemente aus.

Vielmehr sollten Sie typeof(mpg[[input$var1]]) verwenden, etc, weil Sie das Element der Liste (nicht die Liste, die das Element enthält) extrahieren möchten.

Zwei:

Es gibt tatsächlich eine bestimmte Funktion in ggplot, aes_string, die die Spalten wählt auf einer Zeichenkette basierend auf Grundstück.

Die Integration dieser beiden Änderungen sollte Ihre glänzende App funktionieren lassen. Ich habe auch Ihren Server ein wenig vereinfacht, um den üblichen ggplot Code loszuwerden.

server <- function(input,output){ 

    output$distPlot <- renderPlot({ 

    p <- ggplot(mpg) + xlab(input$var1) + 
         ylab(input$var2) + 
         ggtitle(paste("Plot", input$var1, "vs", input$var2)) 

    if(typeof(mpg[[input$var1]]) == "character" | 
     typeof(mpg[[input$var2]]) == "character") 
    { 
     p <- p + geom_boxplot(mapping = 
         aes_string(x = input$var1, 
            y = input$var2)) 
    } 

    else 
    { 
    p <- p + geom_point(mapping = 
        aes_string(x = input$var1, 
           y = input$var2)) 
    } 

    return(p) 

    }) 
} 
Verwandte Themen