如何解决r中的'argument x is empty'错误(闪亮的网络应用程序)



我正在努力学习在R中构建一个基于机器学习的闪亮界面。我花了几个小时来解决这个"argument 10 is empty"错误,但不知道如何解决。我的代码遵循@dataprofessor从Github创建的结构。我将非常感谢任何建议、提示和更正。谢谢

这是我的代码:

# Import libraries
library(shiny)
library(data.table)
library(randomForest)
library(caret)
library(mlbench)
data("Glass")
# Read in the RF model
model <- readRDS("model.rds")
# Training set
set.seed(345)
train.index=createDataPartition(Glass[,ncol(Glass)],p=0.7,list=FALSE)
train=Glass[train.index,]

####################################
# User interface                   #
####################################
ui <- pageWithSidebar(

# Page header
headerPanel('Glass type Predictor'),

# Input values
sidebarPanel(
HTML("<h3>Input parameters</h4>"),
sliderInput("RI", label = "Refractive index", value = mean(train$RI),
min = min(train$RI),
max = max(train$RI)),
sliderInput("Na", label = "Sodium", value = mean(train$Na),
min = min(train$Na),
max = max(train$Na)),
sliderInput("Mg", label = "Magnesium", value = mean(train$Mg),
min = min(train$Mg),
max = max(train$Mg)),
sliderInput("Al", label = "Aluminum", value = mean(train$Al),
min = min(train$Al),
max = max(train$Al)),
sliderInput("Si", label = "Silicon", value = mean(train$Si),
min = min(train$Si),
max = max(train$Si)),
sliderInput("K", label = "Potassium", value = mean(train$K),
min = min(train$K),
max = max(train$K)),
sliderInput("Ca", label = "Calcium", value = mean(train$Ca),
min = min(train$Ca),
max = max(train$Ca)),
sliderInput("Ba", label = "Barium", value = mean(train$Ba),
min = min(train$Ba),
max = max(train$Ba)),
sliderInput("Fe", label = "Iron", value = mean(train$Fe),
min = min(train$Fe),
max = max(train$Fe)),

actionButton("submitbutton", "Submit", class = "btn btn-primary")
),

mainPanel(
tags$label(h3('Status/Output')), # Status/Output Text Box
verbatimTextOutput('contents'),
tableOutput('tabledata') # Prediction results table

)
)
####################################
# Server                           #
####################################
server<- function(input, output, session) {

# Input Data
datasetInput <- reactive({  

df <- data.frame(
Name = c("Refrative index",
"Sodium",
"Magnesium",
"Aluminum",
"Silicon",
"Potassium",
"Calsium",
"Barium",
"Iron"),
Value = as.character(c(input$RI,
input$Na,
input$Mg,
input$Al,
input$Si,
input$K,
input$Ca,
input$Ba,
input$Fe,)),
stringsAsFactors = FALSE)

Type <- 5
df <- rbind(df, Type)
input <- transpose(df)
write.table(input,"input.csv", sep=",", quote = FALSE, row.names = FALSE, col.names = FALSE)

test <- read.csv(paste("input", ".csv", sep=""), header = TRUE)

Output <- data.frame(Prediction=predict(model,test), round(predict(model,test,type="prob"), 3))
print(Output)

})

# Status/Output Text Box
output$contents <- renderPrint({
if (input$submitbutton>0) { 
isolate("Calculation complete.") 
} else {
return("Server is ready for calculation.")
}
})

# Prediction results table
output$tabledata <- renderTable({
if (input$submitbutton>0) { 
isolate(datasetInput()) 
} 
})

}
####################################
# Create the shiny app             #
####################################
shinyApp(ui = ui, server = server)

这是模型的代码。RDS

library(randomForest)
library(mlbench)
data("Glass")
#################################################################
#################################################################
#########random split to training and test set##################
set.seed(345)
train.index=createDataPartition(Glass[,ncol(Glass)],p=0.7,list=FALSE)
train=Glass[train.index,]
test=Glass[-train.index,]
#################################################################
#########Random forest model#####################################
#################################################################
#################################################################
model <- randomForest(Type ~ ., data = train, ntree = 500, mtry = 9, importance = TRUE)
model
# Save model to RDS file
saveRDS(model, "model.rds")

最初的问题是由input$Fe后面的伪逗号引起的。这导致了第二个问题,该问题是由代码所需的test数据帧的名称与根据输入值构建的名称之间的不匹配引起的。在构建模型时,我还需要添加对library(caret)的调用。它现在运行,我可以看到Type正在被传递到预测调用中。不确定原因这是需要的,因为预测试图得出Type,所以我删除了它。我还删除了input.csv文件的创建,只直接创建了测试数据帧。

这是完整的app.R

library(shiny)
library(data.table)
library(randomForest)
library(caret)
library(mlbench)
data("Glass")
# Read in the RF model
model <- readRDS("model.rds")
# Training set
set.seed(345)
train.index=createDataPartition(Glass[,ncol(Glass)],p=0.7,list=FALSE)
train=Glass[train.index,]
####################################
# User interface                   #
####################################
ui <- pageWithSidebar(

# Page header
headerPanel('Glass type Predictor'),

# Input values
sidebarPanel(
HTML("<h3>Input parameters</h3>"),
sliderInput("RI", label = "Refractive index", value = mean(train$RI),
min = min(train$RI),
max = max(train$RI)),
sliderInput("Na", label = "Sodium", value = mean(train$Na),
min = min(train$Na),
max = max(train$Na)),
sliderInput("Mg", label = "Magnesium", value = mean(train$Mg),
min = min(train$Mg),
max = max(train$Mg)),
sliderInput("Al", label = "Aluminum", value = mean(train$Al),
min = min(train$Al),
max = max(train$Al)),
sliderInput("Si", label = "Silicon", value = mean(train$Si),
min = min(train$Si),
max = max(train$Si)),
sliderInput("K", label = "Potassium", value = mean(train$K),
min = min(train$K),
max = max(train$K)),
sliderInput("Ca", label = "Calcium", value = mean(train$Ca),
min = min(train$Ca),
max = max(train$Ca)),
sliderInput("Ba", label = "Barium", value = mean(train$Ba),
min = min(train$Ba),
max = max(train$Ba)),
sliderInput("Fe", label = "Iron", value = mean(train$Fe),
min = min(train$Fe),
max = max(train$Fe)),

actionButton("submitbutton", "Submit", class = "btn btn-primary")
),

mainPanel(
tags$label(h3('Status/Output')), # Status/Output Text Box
verbatimTextOutput('contents'),
tableOutput('tabledata') # Prediction results table

)
)
####################################
# Server                           #
####################################
server<- function(input, output, session) {

# Input Data
datasetInput <- reactive({  

df <- data.frame(
Name = c("RI",
"Na",
"Mg",
"Al",
"Si",
"K",
"Ca",
"Ba",
"Fe"),
Value = as.character(c(input$RI,
input$Na,
input$Mg,
input$Al,
input$Si,
input$K,
input$Ca,
input$Ba,
input$Fe)),
stringsAsFactors = FALSE)
input <- transpose(df)
test = input[2,]
names(test) = as.character(input[1,])

Output <- data.frame(Prediction=predict(model,test), round(predict(model,test,type="prob"), 3))
Output
})

# Status/Output Text Box
output$contents <- renderPrint({
if (input$submitbutton>0) { 
isolate("Calculation complete.") 
} else {
return("Server is ready for calculation.")
}
})

# Prediction results table
output$tabledata <- renderTable({
if (input$submitbutton>0) { 
isolate(datasetInput()) 
} 
})

}
####################################
# Create the shiny app             #
####################################
shinyApp(ui = ui, server = server)

相关内容

最新更新