2016-09-22 77 views
1

我正在开发一个Shiny应用程序,让用户根据需要选择相关/自变量,然后执行C5.0来生成摘要和树形图。但是,生成图时出现错误消息。有谁知道解决方案?请找到代码:在Shiny中绘制动态C5.0决策树

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) 

回答

2

在你server.R尝试

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) 
    }) 
    }) 
} 

解释。plot方法似乎在寻找C5.0()返回值的call元素中指定的条件,并在找不到它们时引发错误。在你的情况下,这是指input对象。解决方法是使用完全指定的公式(例如Species ~ Sepal.Length + Petal.Width)通过eval(parse(text = ...))构造调用C5.0()

+0

非常棒的解决方案,解释也是如此!非常感谢! – tonykuoyj

+0

附加问题:如果我的虹膜数据是reactiveValues对象会怎么样?说:'react_vals < - reactiveValues(data = NULL)''react_vals $ data < - iris',一旦我将iris转换为reactiveValues对象,'plot'方法就会失败。 – tonykuoyj

+0

对于单线解决方案来说,这似乎不是一个问题,您应该用一个最简单的示例来打开一个新问题。 –