Во-первых, ниже я приведу пример, чтобы вы могли увидеть, как это работает. Код ниже генерирует маршрут между двумя координатами.
library(googleway)
set_key( "API KEY")
#databases
df<-structure(list(Properties = c(1,2),
Latitude = c(-24.930473, -24.95575),
Longitude = c(-49.994889, -49.990162),
cluster = c(1,2)), class = "data.frame", row.names = c(NA, -2L))
df1<-structure(list(Properties = c(3,4),Latitude = c(-24.924361,-24.95575),
Longitude = c(-50.004343, -50.007371),
cluster = c(1,2)), class = "data.frame", row.names = c(NA, -2L))
#Table to join df and df1
data_table <- rbind(df,df1)
data_table<-data_table[c(2:3)]
df2<-google_directions(origin = data_table[1,], destination = data_table[3,],
mode = "driving") #I specified properties 1 and 3 which are from cluster 1
df_routes <- data.frame(polyline = direction_polyline(df2))
m1<-google_map() %>%
add_polylines(data = df_routes, polyline = "polyline")
Теперь я пытаюсь сделать это в Shiny, но без указания координат свойств, как в примере выше. В этом смысле я создал selecInput
, чтобы выбрать, в каком кластере я хочу видеть маршрут. Как настроить это в этом коде ниже?
Этот вопрос может помочь: Отрегулируйте новые функции в блестящем
library(shiny)
library(rdist)
library(geosphere)
library(shinythemes)
library(googleway)
set_key( "API KEY")
function.cl<-function(df,df1,k,Filter1){
#database df
df<-structure(list(Properties = c(1,2),
Latitude = c(-24.930473, -24.95575),
Longitude = c(-49.994889, -49.990162),
cluster = c(1,2)), class = "data.frame", row.names = c(NA, -2L))
df1<-structure(list(Properties = c(3,4),Latitude = c(-24.924361,-24.95575),
Longitude = c(-50.004343, -50.007371),
cluster = c(1,2)), class = "data.frame", row.names = c(NA, -2L))
#Table to join df and df1
data_table <- rbind(df,df1)
data_table1<-data_table[c(2:3)]
#Generate the map with routes
df2<-google_directions(origin = data_table1[1,], destination = data_table1[3,],
mode = "driving")
df_routes <- data.frame(polyline = direction_polyline(df2))
m1<-google_map() %>%
add_polylines(data = df_routes, polyline = "polyline")
plot1<-m1
return(list(
"Plot1" = plot1,
"Data" = data_table
))
}
ui <- bootstrapPage(
navbarPage(theme = shinytheme("flatly"), collapsible = TRUE,
"Cl",
tabPanel("Map of all clusters",
sidebarLayout(
sidebarPanel(
tags$b(h3("Choose the cluster number?")),
sliderInput("Slider", h5(""),
min = 2, max = 2, value = 2),
selectInput("Filter1", label = h4("Select just one cluster to show"),""),
),
mainPanel(
tabsetPanel(
tabPanel("Solution", (google_mapOutput("G2",width = "95%", height = "600")))))
))))
server <- function(input, output, session) {
Modelcl<-reactive({
function.cl(df,df1,input$Slider,input$Filter1)
})
output$G2 <- renderGoogle_map({
Modelcl()[[1]]
})
observeEvent(input$Slider, {
abc <- req(Modelcl()$Data)
updateSelectInput(session,'Filter1',
choices=sort(unique(abc$cluster)))
})
}
shinyApp(ui = ui, server = server)
Если k
представляет номер кластера, на который вы ориентируетесь, а cluster
— это столбец в вашем наборе данных (я не понимаю, почему у вас есть df
и df1
, а затем связываете их вместе), то вы можете просто сделать что-то подобное, чтобы ограничить вводом для вызова google_directions()
должны быть только строки, соответствующие кластеру k
data_table1<-data_table[data_table$cluster==k,c(2:3)]
Затем при вызове google_directions()
вы должны сделать это (обратите внимание, что я сейчас вызываю строку 1 и строку 2 (вместо строки 1 и строки 3 в вашем примере), потому что фильтрация в data_table$cluster==k
выше гарантирует, что data_table1 имеет только две строки, связанные с кластером k
df2<-google_directions(
origin = data_table1[1,],
destination = data_table1[2,],
mode = "driving")
Наконец, я не уверен, что вы хотите вернуть все data_table
. Возможно, вы настроили так, чтобы он возвращал только data_table1
(т.е. подмножество с интересующим вас кластером)?:
return(list(
"Plot1" = plot1,
"Data" = data_table1
))
хорошо, вы выбираете два разных кластера, когда перемещаете ползунок? Ползунок в настоящее время принимает только 1 возможное значение - минимальное и максимальное одинаковы!!!
Это решило @Antonio, или в моем коде чего-то не хватало?
Я считаю, что вы правы. Позвольте мне сначала проверить кое-что.
Это верно! У меня будет еще один вопрос по этому поводу, но лучше задать другой вопрос. Как только сделаю, вставлю сюда ссылку, вдруг посмотришь. Еще раз спасибо @langtang
Спасибо за ответ @langtang. Это просто помогает мне понять: когда я выбираю кластер 1 в
selectInput
, появляется график, когда я выбираю кластер 2, разве не должен появляться другой график? потому что это другие координаты.