第三章 研究流程
第三節 Server
一、介紹及用途
Server 的用途是將選取年份與選取變數設定為統計分析方法的運 算參數,並將計算結果以圖像化的方式展現。而圖像化還需透過Leaflet 套件,故將於下一節討論。
二、實際操作
如上節所述,建立起UI 後,接著將 Server 的架構分成兩部分(如下) 解釋,一為buttom,另一個為 myMap。
#Server 架構
Server <- function(input, output) {
buttom<-eventReactive(input$zoomButton,{↔}) output$myMap <- renderLeaflet({↔})
}
其中,內置函數「eventReactive」與「renderLeaflet」,分別對應(位 於UI 的)「actionButton」與「leafletOutput」。
「eventReactive」函數是通過操作按鈕 (即 actionButton)觸 發命令,該命令即為您所勾選的變數和選擇的年份。
「renderLeaflet」函數是將觸發命令所整理、計算後的資料傳至
「myMap」這個參數裡,並透過「leafletOutput」圖像化資訊。
下圖為Server 架構,資料處裡、Rarea2@data 格式、map 資料下都 還有小項目,但圖中不再細分,因依下圖區塊尋找已足夠方便,過細反 而難找。
圖
6 Server 架構
(一)資料檢視在初步整理資料,並分析時,其實不用使用到資料檢視這個環節,
但在後期要套用在Server 與 UI,或更進一步要串連 Server 與 UI 時常會 遇到資料屬 性 不合的問題 、 對照資 料 排序時的繁瑣 步驟還 有降低
「myMap」參數錯誤的可能性,以下提醒一些要注意的資料屬性,以及 使用「renderPrint」與「verbatim-TextOutput」來檢視資料的便利性,但 若不看不懂此段,亦可跳過此段,並使用固定年分及特定變數慢慢檢查。
其中「renderPrint」函數是將您所勾選的變數和選擇的年份,經過 整理或計算後以文字檔的方式回傳至「verbatimTextOutput」所在的 box 裡,故可以直接透過選擇年分及變數,改變如同下一頁的圖7 所呈現的 資料。
#傳資料的指令
renderPrint(list(class(as.vector(unlist(buttom()))),butto m()))
buttom()又等於
list(Ind.v,YY,Year.x,Y.sum.pca.point,rank(Y.sum.pca.point))
故,按順序來說,圖 7 的資料為 class、Ind.v、YY、Year.x、
Y.sum.pca.point、rank,分別代表 buttom()的資料屬性、選取的變數、選 取的年分、選取變數及年分後所對應的資料、PCA 分數得點、分數得點 的排序。
Sevrver架構
buttom
資料處理 流程控制
myMap
Rarea2@data
格式 map資料
圖
7 檢視資料圖
提醒: myMap 所使用的參數屬性須為 numeric。
變數選擇僅有一個時,PCA 分數得點無意義,故須有流程控制。
PCA 分數得點有時會多一個負號,於事後 rank 及地圖顯色上 會與實際涵義相反,須多加注意。
若要檢查「選取變數及年分後所對應的資料」是否正確,可拿 圖中的資料與原始資料對照。
Ind.v(選取的變數)與 YY(選取的年分)的 input 皆為變數(指令 如下),以此方式檢視資料,較便利。
#選變數
df = data.frame(subject=c("故意殺人","擄人勒贖","強盜
",…),id=c(1:33))
Ind.v<-(df %>% filter(subject %in%
c(input$in1,input$in2,…)) %>% select(id))
#選年分
dff=data.frame(subjectt=c("Y7","Y8","Y9",…),idd=c(97:106)) YY<-(dff %>% filter(idd %in% (input$slider2[1]:
input$slider2[2])) %>% select(subjectt))
(二)buttom 裡的結構
Ind.v<-(df %>% filter(subject %in%
c(input$in1,input$in2,input$in3,…)) %>% select(id))
#選年分
dff =
data.frame(subjectt=c("Y7","Y8","Y9",…),idd=c(97:106)) YY<-(dff %>% filter(idd %in%
(input$slider2[1]:input$slider2[2])) %>% select(subjectt))
(2) 表格整理的部分,於讀檔後,為便於分析以陣列呈現,在此著重於 AA 即 function(L)的意思。函數裡 Year$Y6*L[10]+Year$Y5*L[9]+…,可 拆成變數 Year 及 L。Year 是以年分(97~106)劃分的資料,選取「$」的
#表格整理
data <- read.csv("d:/專題原始資料.csv", header=T, sep=",") year.array<-array(apply(as.matrix.noquote(data[5:26,2:331]),
2,as.numeric),dim=c(22,33,10))
colnames(year.array)<-c("故意殺人","擄人勒贖","強盜",…)
rownames(year.array)<-c("新北市","臺北市",…,"金門縣","連江縣") Year<-list(Y6=year.array[,,1],Y5=year.array[,,2],Y4 =
year.array[,,3],…)
L<-ifelse(list("Y7","Y8","Y9",…)%in%(YY$subjectt),T,F) AA <- function(L){
Year$Y6*L[10]+Year$Y5*L[9]+Year$Y4*L[8]+…
}
(3) 選擇年分及變數後的資料主要是透過前兩項所提到的選變數、選年 分及表格整理個別對應到的結果Ind.v、YY 、AA 所做的總整理並命名 為「Year.x」,且在下一節做的資料分析,皆是以這個整理完的資料做計 算。
#選擇年分及變數後的資料
Year.x<-AA(L)[,Ind.v$id]
2. 流程控制
在資料整理完後做流程控制的用意很簡單,因為下一節裡的資料分 析,我們是採用PCA 來縮減資料維度,以便在最後的地圖顯色時使用。
然而,重點在於 PCA 是用來縮減資料維度時所使用的,所以當我們選 取的變數僅有一個的時候,採用 PCA 並沒有意義,故以下面的方式控 制選取變數為1 個時,將不同年分的該變數總和即可。其中 Ind.v 是您 選取變數所對應的編碼,實屬向量,故可直接length( )函數檢視 Ind.v 長 度是否為1(即選取變數是否為 1),並藉此方式,控制流程。
#流程控制
if(length(Ind.v)<=1){做 A}else{做 B}
(三)myMap 裡的結構
myMap 可分為兩的部分,一是將 buttom 裡的資料整理成分割縣市 所需的資料格式Rarea2@data,另一則是將 Rarea2@data 套用在 leaflet( ) 函數裡。由於myMap 的結構大致上是固定的,所以本段將提醒一些需 要更改或需要注意之事項,其餘維持不變即可。
1. Rarea2@data 格式
Rarea2@data 格式裡需要更改的,只有標成粗黑體字的三個部分
city2、Rank、
Rank_YY.csv。分三點如下。
#Rarea2@data 格式
city2=as.vector(unlist(buttom()))
COUNTYENG=c ("New Taipei City","Taipei City"…) Rank=floor(rank(city2))
TWN = readOGR ({↔}) %>% spTransform({↔}) list<-c ("New Taipei City","Taipei City",…) Rarea2<-subset(TWN, COUNTYENG %in% list) aa=as.data.frame(cbind(COUNTYENG,(P_N))) aa[,2]=as.numeric(as.character(aa[,2])) colnames(aa)=c("COUNTYENG","P_N")
bb <-as.data.frame(read.table("Rank_YY.csv",header = TRUE,sep
= ",")
cc <-as.data.frame(read.table(↔))
Rarea2@data<-left_join(Rarea2@data, aa,by=c("COUNTYENG")) Rarea2@data<-left_join(Rarea2@data, bb,by=c("P_N"))
Rarea2@data<-left_join(Rarea2@data, cc,by=c("COUNTYENG")) pal=colorFactor("Reds",levels = c("普通","不良","危險")) labels <- sprintf(↔)%>% lapply(htmltools::HTML)
(1)
city2 是要對應 buttom 裡的 PCA 分數得點,要特別注意的是資料屬性須為
提,
Rank_YY.csv 須與指令檔案放在同意件夾裡才能開啟。
2. map 資料
map 資料同樣是使用管線運算「%>%」將左側的運算結果傳遞至 右側的參數,過程依序為leaflet ( )、addTiles ( )、setView ( )、addLegend ( )、addProviderTiles ()、addPolygons ( ),但主要提到的只有 setView ( ),
而addLegend ( )、addProviderTiles ()、addPolygons ( ),且於下節才述明,
因為map 為 Leaflet 所使用之資料。