获取错误:不允许从shinyoutput对象读取对象 - 多元线性回归模型

时间:2018-05-19 17:04:39

标签: r shiny

我是Rshiny的新手,不知道我做错了什么.. 基本上,我想构建一个多元线性回归模型,它可以根据mtcars数据集上的模型构建来预测上传文件的值。 这也应该允许用户选择自变量。 但是,当我这样做时它会给我错误: - 不允许从shinyoutput对象中读取对象

请在下面找到代码:

library(shiny)
library(datasets)
library(caret)
library(shiny)
library(curl)

library(shiny)

ui <- fluidPage(
  titlePanel("My first predictive model"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv')),
      tags$hr(),
      uiOutput("dependent"),
      uiOutput("independents"),
      tags$hr(),
      actionButton("action", "Predict!")
    ),
    mainPanel(
      verbatimTextOutput("summary1")
    )
  )
)

server <- function(input, output, session) {
  filedata <- reactive({
    infile <- input$file1
    if (is.null(infile)){
      return(NULL)      
    }
    read.csv(infile$datapath)
  })

  output$dependent <- renderUI({
    df <- filedata()
    if (is.null(df)) return(NULL)
    items=names(df)
    names(items)=items
    selectInput("dependent","Select ONE variable as dependent variable from:",items)
  })
 output$independents <- renderUI({
 df <- filedata()
 if (is.null(df)) return(NULL)
 checkboxGroupInput('independents','Select the regressors', choices = names(df))
 })
 #regression formula
 regformula <- reactive({
   as.formula(paste(mpg,'~',output$independents))
 })
 #model
 output$summary1 <- renderPrint({
   input$action
   modelq <- lm(regformula(),data=mtcars)
   pred1<-predict(modelq,df)
   summary(modelq())
   pred1
   })
}


shinyApp(ui, server)

1 个答案:

答案 0 :(得分:2)

如果没有掌握一些数据来重现您的应用程序,很难发现错误并使其更像是一个猜谜游戏。

所以我的第一个猜测是,您没有正确处理应用中的反应。你是render *函数正在调用反应值,但是当没有上传文件且没有选择了Regressor时,没有数据可以使用,所以它会抛出错误。我建议查看Shiny反应原理和函数observeEvent, req, validate

然后您可以删除is.null(*)行,因为req()函数会为您执行此操作。

接下来想一想,mpg是什么? 而且我认为您也应该将summary(modelq())更改为summary(modelq),因为您只想打印对象的摘要而不是调用对象。

调用library(shiny)一次就足够了。 ;)

在预测中,您还调用了df,该函数未在该函数中分配。我添加了一个reactiveValues对象,您可以在其中以反应方式保存其他对象。在第二个renderUI中,我们将数据添加到reactiveValues对象,如df$file <- df。在预处理函数中,您可以像这样predict(modelq,df$file)调用数据。

我还将regformula更改为eventReactive(),每次按下操作按钮时都会执行该事件。

最后,我改为将公式创建更改为as.formula(paste("mpg",'~',paste(input$independents, collapse= "+"))),就像你只调用输入$ independentnts一样,它只接受第一个参数。

library(shiny)
library(datasets)
library(caret)
library(curl)

ui <- fluidPage(
  titlePanel("My first predictive model"),
  sidebarLayout(
    sidebarPanel(
      fileInput('file1', 'Choose CSV File',
                accept=c('text/csv', 
                         'text/comma-separated-values,text/plain', 
                         '.csv')),
      tags$hr(),
      verbatimTextOutput("smp"),
      uiOutput("dependent"),
      uiOutput("independents"),
      tags$hr(),
      actionButton("action", "Predict!")
    ),
    mainPanel(
      verbatimTextOutput("summary1")
    )
  )
)

server <- function(input, output, session) {
  filedata <- reactive({
    infile <- input$file1
    read.csv(infile$datapath)
  })

  df <- reactiveValues(file = NULL)

  output$dependent <- renderUI({
    req(input$file1)
    df <- filedata()
    items=names(df)
    names(items)=items
    selectInput("dependent","Select ONE variable as dependent variable from:",items)
  })
  output$independents <- renderUI({
    req(input$file1)
    df <- filedata()

    df$file <- df

    checkboxGroupInput('independents','Select the regressors', choices = names(df))
  })
  #regression formula
  regformula <- eventReactive(input$action, {
    as.formula(paste("mpg",'~',paste(input$independents, collapse= "+")))
  })
  #model

  output$summary1 <- renderPrint({
    req(regformula())
    req(input$file1)

    modelq <- lm(regformula(),data=mtcars)

    df <- filedata()

    pred1<-predict(modelq,df); 
    names <- df$X

    data.frame(X = as.character(names), Prediction = pred1)
  })
}

shinyApp(ui, server)