我是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)
答案 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)