Я создаю блестящее приложение, которое генерирует карту кластера на основе многокритериального метода ВИКОР. В этом смысле я сделал два selecInput
, чтобы пользователь мог выбрать maximize (max)
или minimize (min)
определенный критерий. В данном случае у меня есть два критерия. Код ниже работает как есть, так как я не удалял maxmin <- c('min','max')
из кода. Однако, если я откажусь, я не смогу сгенерировать карту. Но идея в том, что max
и min
выбираются selecInput
. Как это настроить?
Исполняемый код ниже:
library(shiny)
library(rdist)
library(geosphere)
library(shinythemes)
library(leaflet)
library(shinyjs)
library(MCDM)
function.cl<-function(df,k,maxmin){
#database df
df<-structure(list(Properties = c(1,2,3,4,5,6,7),
Latitude = c(-23.8, -23.8, -23.9, -23.9, -23.9,-23.4,-23.5),
Longitude = c(-49.6, -49.3, -49.4, -49.8, -49.6,-49.4,-49.2),
Coverage = c (1526, 2350, 3526, 2469, 1285, 2433, 2456),
Production = c(526, 350, 526, 469, 285, 433, 456)), class = "data.frame", row.names = c(NA, -7L))
#Vikor
df1 <- df[c(4:5)]
df1<-data.matrix(df1)
weights <- c(0.5,0.5)
maxmin <- c('min','max')
v <- 0.5
scaled<-VIKOR(df1,weights,maxmin,v)
k<-subset(scaled, Ranking==2)$Alternatives #cluster number
#clusters
coordinates<-df[c("Latitude","Longitude")]
d<-as.dist(distm(coordinates[,2:1]))
fit.average<-hclust(d,method = "average")
clusters<-cutree(fit.average, k)
nclusters<-matrix(table(clusters))
df$cluster <- clusters
df1<-df[c("Latitude","Longitude")]
#Color and Icon for map
ai_colors <-c("red","gray","blue","orange","green","beige")
clust_colors <- ai_colors[df$cluster]
icons <- awesomeIcons(
icon = 'ios-close',
iconColor = 'black',
library = 'ion',
markerColor = clust_colors)
# Map for all clusters:
m1<-leaflet(df1) %>% addTiles() %>%
addMarkers(~Longitude, ~Latitude) %>%
addAwesomeMarkers(lat=~df$Latitude, lng = ~df$Longitude, icon=icons, label=~as.character(df$cluster)) %>%
addLegend( position = "topright", title = "Cluster", colors = ai_colors[1:max(df$cluster)],labels = unique(df$cluster))
plot1<-m1
return(list(
"Plot1" = plot1
))
}
ui <- bootstrapPage(
useShinyjs(),
navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
"Cl",
tabPanel("Solution",
sidebarLayout(
sidebarPanel(
selectInput("maxmin1", label = h5("Maximize or Minimize?"),
choices = list("","max " = "1", "min" = "2"), selected = "1"),
selectInput("maxmin2", label = h5("Maximize or Minimize?"),
choices = list("","max " = "1", "min" = "2"), selected = "2")),
mainPanel(
tabsetPanel(
tabPanel("Solution", (leafletOutput("Leaf1",width = "95%", height = "600")))))
))))
server <- function(input, output, session) {
Modelcl<-reactive({
function.cl(df,k,maxmin=c(input$maxmin1, input$maxmin2))
})
output$Leaf1 <- renderLeaflet({
req(maxmin=c(input$maxmin1, input$maxmin2))
Modelcl()[[1]]
})
}
shinyApp(ui = ui, server = server)
Ваш selectInput
должен быть таким.
selectInput("maxmin1", label = h5("Maximize or Minimize?"),
choices = list("", "max", "min"), selected = "max"),
selectInput("maxmin2", label = h5("Maximize or Minimize?"),
choices = list("", "max", "min"), selected = "min")),
Вы делаете "max" = "1" "min" = "2"
. Это означает, что вы передаете "1" "2"
параметру cb
в функции VIKOR
. Но cb
примет c('min', 'max')
в качестве значения параметра.
Я бы предпочел изменить этот путь. replace(x, x == c('min','max'),c('-', '+'))
, если вы сохраните x<-c('min', 'max')
где-нибудь в коде. Надеюсь это поможет
К сожалению, я не смог настроить, если вы видите это, я был бы признателен: stackoverflow.com/questions/71528241/… -team
Спасибо за ответ @msr_003! Вопрос, если вы знаете ответ: В этом вопросе я использовал метод ВИКОР, но я также использую метод ТОПСИС, но он использует
-
и+
вместоmin
иmax
. Итак, есть ли способ позволитьselectInput
применяться в обоих случаях или каким-то образом установить-
и+
наmin
иmax
? См. ТОПСИС (cran.r-project.org/web/packages/topsis/topsis.pdf)