我尝试构建一个闪亮的应用程序。目标是让用户在输入框中输入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进行测试。感谢
答案 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
是一个字符串,因此您必须创建一个包含paste0
和as.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)