2016-09-22 16 views
0

私はShinyアプリケーションを開発しており、必要に応じて依存/独立変数を選択し、C5.0を実行してサマリーとツリープロットを生成します。しかし、plotメソッドでプロットを生成すると、適切なオブジェクトが見つかりませんでした。これは拡張質問のPlotting a dynamic C5.0 decision tree in Shinyです。 plot方法は、親切にコードを見つけるreactiveValue()オブジェクトではなく、単純なデータフレームにirisを変換した後、再度失敗:reactiveValues()でShinyの動的C5.0デシジョンツリーをプロットする

# ui.R 
library(shiny) 

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) 

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) 
    }) 
    # tranforming iris to reactiveValues() object 
    react_vals <- reactiveValues(data = NULL) 
    react_vals$data <- iris 

    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 = %s)", form, 'react_vals$data'))) 
    output$tree_summary <- renderPrint(summary(c50_fit)) 
    output$tree_plot_c50 <- renderPlot({ 
     plot(c50_fit) 
    }) 
    }) 
} 
+0

たちは '分離株()' 'でreact_vals $ data'をラップすることができない理由理由はありますか? 'sprintf(" C5.0(%s、data =%s) "、フォーム、 'isolate(react_vals $ data)')'のように。 –

+0

'isolate()'の 'react_vals $ data'をラップしていますか?私は同じエラーメッセージを試してみました。 – tonykuoyj

+0

あなたが正しいです、それは動作しません。考えてみましょう。 'react_vals $ data'にデータフレームを割り当てる動機は何ですか? –

答えて

1

マイ推測plot方法は、グローバルな環境でのreact_valsを探しているということです。その場合は、<<-を使用して、地球環境の変数にirisを代入するのが簡単な解決方法です(理想的ではありません)。では、あなたのserver.R

# tranforming iris to reactiveValues() object 
react_vals <<- reactiveValues(data = NULL) 
react_vals$data <<- iris 

簡単な実験は私の推測を確認。機能にC5.0()、その後plot()をラップすると、エラーがスローされます。

library(C50) 
test <- function(dat) { 
    fit <- C5.0(Species ~ Sepal.Length, dat) 
    plot(fit) 
} 

test(iris) 
# Error in is.data.frame(data) : object 'dat' not found 
+0

ええ、これは動作します!私はグローバル環境にオブジェクトを割り当てることについて読むことはお勧めできません。 – tonykuoyj

+0

それは理想的な解決策ではありません。しかし、それはまた1文字の修正です。ときにトレードオフがそれに値する場合もあります。 –

関連する問題