昨天有提到,有些耗時的事情我們並不希望每次資料分析時都在重新做一遍,那鐵人賽到今天有,有想到我們之前做的什麼事情需要耗費大量時間嗎?沒錯,在跟Google 要取經緯度資訊時,我們花了非常多的時間等結果。
首先ui 規劃上,我們分兩部分,一個是按扭區,另一個是表格區。
library(shiny)
shinyUI(fluidPage(
fluidRow(
column(3,
h4("API抓取經緯度"),
actionButton("request", "取資料")
),
column(9,
tableOutput('addressTable')
)
)
))
另外因為先前抓取經緯度,我們有定義了幾個函式,這次我把這幾個函式獨立抽出來變成一個r 檔,之後便可以用source 取得這些函式。
再來是server的部分,我想要按下按鈕時,去google 撈取資料,並呼叫圖表更新,所以我先定義了一個reactiveValues ,初始值address 為本地端csv。
library(shiny)
library(tidyr)
library(dplyr)
source("draw_map_function.R")
shinyServer(function(input, output) {
v <- reactiveValues(address = read.csv("input/address.csv", stringsAsFactors=FALSE, header=FALSE))
})
接著,就是幫按鈕加上事件,也就是按下按鈕後,會對每筆資料執行getLatLng(),抓取結束後將結果放到v$addressWithLatLng。
observeEvent(input$request, {
v$addressWithLatLng <- v$address %>%
rowwise() %>%
mutate(LatLng = getLatLng(V1)) %>%
filter(LatLng!="error") %>%
separate(LatLng, c("Lat", "Lng"), sep=",") %>%
mutate(Lat=as.numeric(Lat), Lng=as.numeric(Lng))
})
最後,只要再加上圖表的部分,這邊的邏輯很簡單,我們只需要判斷v$addressWithLatLng 是不是有值就好。
output$addressTable <- renderTable({
if (is.null(v$addressWithLatLng)) return(v$address)
v$addressWithLatLng
})
結果如下:
1.一開始的地址資料。
2.按下取資料後的狀態。
以上就是今天的介紹,明天我們又會針ui 畫面做一些介紹。
ref:
day25原始碼