2016-09-22 5 views
1

Ich entwickle eine Shiny-Anwendung, damit Benutzer abhängige/unabhängige Variablen bei Bedarf auswählen können. Führen Sie dann C5.0 aus, um eine Zusammenfassung und ein Baumdiagramm zu erstellen. Es gab jedoch eine Fehlermeldung beim Generieren des Diagramms. Kennt jemand die Lösung? finden freundlicherweise den Code:Zeichnen eines dynamischen C5.0-Entscheidungsbaums in Shiny

library(shiny) 

ui <- fluidPage(
    titlePanel('Plotting Decision Tree'), 
    sidebarLayout(
    sidebarPanel(
     h3('iris data'), 
     uiOutput('choose_y'), 
     uiOutput('choose_x'), 
     actionButton('c50', label = 'Generate C5.0 summary and plot') 
    ), 
    mainPanel(
     verbatimTextOutput('tree_summary'), 
     plotOutput('tree_plot_c50') 
    ) 
) 
) 

# server.R 
library(shiny) 
library(C50) 

server <- function(input, output) { 
    output$choose_y <- renderUI({ 
    is_factor <- sapply(iris, FUN = is.factor) 
    y_choices <- names(iris)[is_factor] 
    selectInput('choose_y', label = 'Choose Target Variable', choices = y_choices) 
    }) 

    output$choose_x <- renderUI({ 
    x_choices <- names(iris)[!names(iris) %in% input$choose_y] 
    checkboxGroupInput('choose_x', label = 'Choose Predictors', choices = x_choices) 
    }) 

    observeEvent(input$c50, { 
    c50_fit <- C5.0(as.formula(paste(isolate(input$choose_y), '~', paste(isolate(input$choose_x), collapse = '+'))), data = iris) 
    output$tree_summary <- renderPrint(summary(c50_fit)) 
    output$tree_plot_c50 <- renderPlot({ 
     plot(c50_fit) 
    }) 
    }) 
} 

shinyApp(ui, server) 

Antwort

2

In Ihrem server.R versuchen

function(input, output) { 
    output$choose_y <- renderUI({ 
    is_factor <- sapply(iris, FUN = is.factor) 
    y_choices <- names(iris)[is_factor] 
    selectInput('choose_y', label = 'Choose Target Variable', choices = y_choices) 
    }) 

    output$choose_x <- renderUI({ 
    x_choices <- names(iris)[!names(iris) %in% input$choose_y] 
    checkboxGroupInput('choose_x', label = 'Choose Predictors', choices = x_choices) 
    }) 

    observeEvent(input$c50, { 
    form <- paste(isolate(input$choose_y), '~', paste(isolate(input$choose_x), collapse = '+')) 
    c50_fit <- eval(parse(text = sprintf("C5.0(%s, data = iris)", form))) 
    output$tree_summary <- renderPrint(summary(c50_fit)) 
    output$tree_plot_c50 <- renderPlot({ 
     plot(c50_fit) 
    }) 
    }) 
} 

Erklärung. Die plot Methode scheint nach den Begriffen zu suchen, die im call Element des zurückgegebenen Werts von C5.0() angegeben sind, und gibt einen Fehler aus, wenn sie nicht gefunden werden. In Ihrem Fall bezieht sich dies auf das Objekt input. Die Problemumgehung besteht darin, C5.0() mit der vollständig angegebenen Formel (z. B. Species ~ Sepal.Length + Petal.Width) durch die eval(parse(text = ...)) Konstruktion aufzurufen.

+0

Super Lösung, und so ist die Erklärung! Danke vielmals! – tonykuoyj

+0

Zusätzliche Frage: Was ist, wenn meine Irisdaten ein reactiveValues-Objekt sind? Sagen wir: 'react_vals <- reactiveValues ​​(data = NULL)' 'react_vals $ data <- iris', die' plot' Methode schlägt fehl, wenn ich 'iris' in ein reactiveValues ​​Objekt umgewandelt habe. – tonykuoyj

+0

Scheint nicht wie eine Frage mit einer Einzeiler-Lösung, Sie sollten eine neue Frage mit einem minimalen Beispiel öffnen. –