【问题标题】:Plotting dynamic C5.0 decision tree in Shiny with reactiveValues()使用 reactiveValues() 在 Shiny 中绘制动态 C5.0 决策树
【发布时间】:2017-01-30 17:25:09
【问题描述】:

我正在开发一个 Shiny 应用程序,让用户根据需要选择因/自变量,然后执行 C5.0 以生成摘要和树形图。但是,在生成有关plot 方法的绘图时出现错误消息,找不到合适的对象。这是Plotting a dynamic C5.0 decision tree in Shiny 的扩展问题。将iris 转换为reactiveValue() 对象而不是简单的数据框后,plot 方法再次失败,请查找代码:

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

【问题讨论】:

  • 有什么理由不能将react_vals$data 包裹在isolate() 中吗?如sprintf("C5.0(%s, data = %s)", form, 'isolate(react_vals$data)')
  • react_vals$data 包裹在isolate() 中是否有效?我试过了,得到了同样的错误信息。
  • 你说得对,那行不通。让我想一想。您将数据框分配给react_vals$data 的动机是什么?

标签: r shiny


【解决方案1】:

我的猜测plot 方法是在全局环境中寻找react_vals;如果是这种情况,一个简单的解决方案(但并不理想)是使用&lt;&lt;-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

【讨论】:

  • 是的,这确实有效!我想我读到不推荐将对象分配给全局环境。
  • 对,这就是为什么它不是一个理想的解决方案。但这也是一个字符修复。有时这种权衡是值得的。
猜你喜欢
  • 1970-01-01
  • 2015-12-18
  • 2021-10-01
  • 2018-02-09
  • 2014-08-30
  • 2016-11-09
  • 1970-01-01
  • 2019-01-30
  • 2013-02-09
相关资源
最近更新 更多