나는 R과 반짝 이는 꽤 초보자입니다. 나는 origin-destination 흐름 데이터를 탐색 할 수있는 응용 프로그램을 만들려고 노력해 왔습니다. 원산지 영역 번호, 대상 영역 번호 및 정보 필드 묶음과 함께 영역의 모양 파일을 폴리곤으로 가지고있는 CSV를 가져 와서 특정 영역으로 또는 특정 영역에서의 흐름을 묘사 할 수 있습니다. 실제로 작동하는 반짝 이는 애플 리케이션을 가지고 있지만 너무 비효율적이거나 어쩌면이 작업에 적합한 도구가 아닐 수도 있습니다. 아래 코드를 붙여 넣습니다.셰이프 파일 및 CSV에서 전단지를 생성하는 반짝이는 앱입니다. 대형 shapefiles와 충돌
내 문제는 너무 많은 메모리를 사용하는 것 같습니다. 적은 수의 영역에서는 작동하지만 속도가 매우 느립니다 (처음에는로드가 오래 걸리고 입력 중 하나가 변경 될 때마다 업데이트됩니다). 더 큰 문제는 내가 수백 또는 수천 개의 영역을 가진 대용량 영역 시스템에서 일반적으로 수백만 개의 정점을 가지고 작업한다는 것입니다. 이 큰 영역 시스템 중 하나에이 기능을 적용하려고하면 초기에로드되지만 두 개 또는 세 개의 이동 (확대/축소 또는 패닝) 또는 한 번의 입력 변경 후에 RStudio가 충돌합니다.
이렇게하면 더 효율적으로 만들 수있는 방법이 있는지 또는 RStudio/Shiny가 이와 같은 용도로 사용되지는 않을지 궁금합니다. 최적화에 대해서는 꽤 우둔한 점을 염두에 두십시오. 설명을 약간 어리둥절하게 만들면 고맙겠습니다.
library(shiny)
library(rgdal)
library(sp)
library(leaflet)
library(RColorBrewer)
shape <- readOGR(dsn=".", layer="zones")
shape <- spTransform(shape, CRS("+init=EPSG:4326"))
다음, 데이터를 Shape 파일 읽기 :
이
가 작동하는 응용 프로그램입니다. 'i'와 'j'는 출발지와 목적지 존 번호입니다. 지도를 만들 수있는 필드 목록이 필요하며 숫자로 된 필드로 구성되어야합니다. 루프없이 부분 집합하는 방법을 찾지 못했습니다. 그것에 대한 도움을 주시면 감사하겠습니다.values <- read.csv("values.csv")
zonelist <- sort(unique(c(values$i, values$j)))
zones <- length(zonelist)
fieldlist <- as.vector(character())
fields <- 0
for (valname in colnames(values)){
if (valname != "i" &
valname != "j" &
is.numeric(values[[valname]])
) {
fields <- fields + 1
fieldlist[fields] <- valname
}
}
그리고 저는 그것을 매트릭스 mm에 넣을 것입니다. 다시 말하지만, 이렇게하는 더 효율적인 방법은 환영받을 것입니다.
mm <- array(numeric(), dim=c(fields,zones,zones))
mm[,,] <- 0
valarray <- array(numeric(), dim=fields*zones*zones)
valarray[] <- 0
for (k in 1:length(values)){
if (colnames(values)[k] %in% fieldlist) {
valarray[(values$j - 1) * zones * fields
+ (values$i - 1) * fields
+ which(colnames(values)[k] == fieldlist)
] <- values[[k]]
}
}
mm[,,] <- valarray
인터페이스는 간단합니다. 참조 영역에서 /로 선택하고 참조 영역을 선택하고 매핑 할 숫자 필드를 선택하십시오. 흐름의 전단지를 보여줍니다.
ui <- fluidPage(
titlePanel("Interzonal values mapping"),
sidebarLayout(
sidebarPanel(
selectInput(inputId = "ft", label = "From/to zone", choices = c("from", "to")),
selectInput(inputId = "zn", label = "Reference zone", choices = zonelist),
selectInput(inputId = "fl", label = "Field to map", choices = fieldlist),
width = 2
),
mainPanel(leafletOutput("mapped_zonelist", height = 800),
width = 10)
)
)
는 서버의 입력에 따라 매트릭스 mm에서 벡터로서 전압 (Vs) 맵핑하는 흐름을 포착하고, 흐름 값에 따른 존 맵 포맷.
server <- function(input, output) {
m <- reactive({
if (input$ft == "from"){
vs <- mm[which(input$fl == fieldlist), as.numeric(input$zn), ]
} else {
vs <- mm[which(input$fl == fieldlist), , as.numeric(input$zn)]
}
c_weight <- numeric()
c_weight[1:zones] <- 1
c_weight[as.numeric(input$zn)] <- 2
c_color <- character()
c_color[1:zones] <- "blue"
c_color[as.numeric(input$zn)] <- "black"
leaflet() %>%
addTiles() %>%
addPolygons(data=shape,
fillOpacity = 0.7,
opacity = 0.8,
weight = c_weight[[email protected]$n],
color = c_color[[email protected]$n],
fillColor = colorNumeric(palette = brewer.pal(10, "RdBu"), domain = vs)(vs[[email protected]$n]),
popup = paste0("Zone ", input$zn, " to zone ", as.character([email protected]$n),
"<br>",
input$fl, " = ", vs)
)
})
output$mapped_zonelist <- renderLeaflet(m())
}
shinyApp(ui = ui, server = server)
도움이 될 것입니다. 감사!
이 코드를 반짝이는 외부에서 실행하면 제대로 작동합니까? –
예제 파일을 제공하여 재현 할 수 있습니까? – Sab