用于预测的闪亮应用程序,显示错误

时间:2016-08-24 07:05:33

标签: r shiny

我尝试构建一个闪亮的应用程序。目标是让用户在输入框中输入csv文件。然后用户可以在文本框中输入因变量名称。主面板将显示模型拟合和绘图的摘要详细信息。

我将以下内容编码为 ui.R

library(shiny)
shinyUI(fluidPage(

titlePanel(h1("ANALYSIS",align = "center")),
sidebarLayout(
    sidebarPanel(

        fileInput('file1', 'Select CSV File',
                  accept=c('text/csv', 
                           'text/comma-separated-values,text/plain', 
                           '.csv')),
        textInput("text", label = strong("Dependent Variable"), 
                  value = "Enter Dependent Variable...")
    ),
    mainPanel(br(),

              textOutput('text1'),
              plotOutput('plot')
        )
        )
))

以下作为server.R:

 library(shiny)
 library(rpart)
 library(rpart.plot)

 shinyServer(function(input, output) {

    output$text1 <- renderText({
    inFile <- input$file1
    if (is.null(inFile))
        return(NULL)
    data <-read.csv(inFile$datapath, header=input$header, sep=input$sep,  quote=input$quote)
    depVar <- input$text
    modrpart <- rpart(depVar ~. ,data=data)
    modrpart
    #depVar


})

    output$plot <- renderPlot({
        inFile <- input$file1
        if (is.null(inFile))
            return(NULL)
        data <-read.csv(inFile$datapath, header=input$header, sep=input$sep,  quote=input$quote)
        depVar <- input$text
        modrpart <- rpart(depVar ~. ,data=data)
        prp(modrpart)
    })


})

调用RunApp时,显示错误“Error in!:invalid argument type”。 模型详细信息和绘图不会按预期显示在主面板中。我错过了什么。我使用https://drive.google.com/open?id=0B0ByEpXfdtGWMjZHUGpNc3ZZSTg进行测试。感谢

1 个答案:

答案 0 :(得分:1)

首先,我创建了一个反应数据集data,其中要求数据集上传req(inFile)。它将防止由于缺少输入而导致的错误传播。

data <- reactive({
    inFile <- input$file1
    req(inFile)
    data <- read.csv(inFile$datapath, header=input$header, sep=input$sep,  quote=input$quote)
    data
  })

之后,我为您的模型创建了另一个被动反应,要求因变量的输入名称是有效变量。由于input$text是一个字符串,因此您必须创建一个包含paste0as.formula函数的公式,以便能够训练模型。您还可以通过data()将反应数据集传递给模型。 (这两个被动反应允许您不必要地重复代码)

model <- reactive({
    req(input$text %in% names(data() ))
    depVar <- input$text
    mod <- as.formula(paste0(depVar, " ~ ."))
    modrpart <- rpart(mod, data = data() )
    modrpart
  })

最后,您可以通过model()render*函数传递模型。

请注意,我将renderText更改为renderPrint,否则会产生错误。 (renderText无法处理“cat”函数)

您收到此错误:“错误!:无效的参数类型”因为您丢失了小部件而且没有input$header和其他几个。我通过添加它来修复它。 (这个简单的上传界面取自here

read.csv(inFile$datapath, header=input$header, sep=input$sep, quote=input$quote)

评论中的请求

已编辑

library(shiny)
library(rpart)
library(rpart.plot)

server <- shinyServer(function(input, output) {

  data <- reactive({
    inFile <- input$file1
    req(inFile)
    data <- read.csv(inFile$datapath, header=input$header, sep=input$sep,  quote=input$quote)
    data
  })

  # reactive test data
  testdata <- reactive({
    inFile <- input$file2
    req(inFile)
    read.csv(inFile$datapath)
  })

  model <- reactive({
    req(input$text %in% names(data() ))
    depVar <- input$text
    mod <- as.formula(paste0(depVar, " ~ ."))
    modrpart <- rpart(mod, data = data() )
    modrpart
  })

  output$text1 <- renderPrint({ # changed to renderPrint
    model()
  })

  output$plot <- renderPlot({
    prp(model() )
  })

  # print predictions to the console
  observe({ 
    pred <- predict(object = model(), newdata = testdata() )
    print(head(pred, 10))
  })

})


ui <- shinyUI(fluidPage(

  titlePanel(h1("ANALYSIS",align = "center")),
  sidebarLayout(
    sidebarPanel(

      fileInput('file1', 'Upload Train Data',
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv')),
      tags$hr(),
      checkboxInput('header', 'Header', TRUE),
      radioButtons('sep', 'Separator',
                   c(Comma=',',
                     Semicolon=';',
                     Tab='\t'),
                   ','),
      radioButtons('quote', 'Quote',
                   c(None='',
                     'Double Quote'='"',
                     'Single Quote'="'"),
                   '"'),
      br(),
      textInput("text", label = strong("Dependent Variable"), 
                value = "Enter Dependent Variable..."),

      # new fileInput
      br(),
      fileInput('file2', 'Upload Test Data', 
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv'))

    ),
    mainPanel(
      br(),
      textOutput('text1'),
      plotOutput('plot')
    )
  )
))

shinyApp(ui, server)