iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 25
2
Data Technology

你都在公司都在幹啥R? R語言資料分析經驗分享系列 第 25

【25】當老闆扎了兩下眼問:那我們手邊資料有什麼情境適合這樣分段處理的嗎?

昨天有提到,有些耗時的事情我們並不希望每次資料分析時都在重新做一遍,那鐵人賽到今天有,有想到我們之前做的什麼事情需要耗費大量時間嗎?沒錯,在跟Google 要取經緯度資訊時,我們花了非常多的時間等結果。
首先ui 規劃上,我們分兩部分,一個是按扭區,另一個是表格區。

library(shiny)
shinyUI(fluidPage(
    fluidRow(
        column(3,
               h4("API抓取經緯度"),
               actionButton("request", "取資料")
        ),
        column(9,
               tableOutput('addressTable')
        )
    )
))

另外因為先前抓取經緯度,我們有定義了幾個函式,這次我把這幾個函式獨立抽出來變成一個r 檔,之後便可以用source 取得這些函式。

https://ithelp.ithome.com.tw/upload/images/20180111/20107299Z1wofuW47W.png

再來是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.一開始的地址資料。

https://ithelp.ithome.com.tw/upload/images/20180111/201072990HL5TES7ti.png

2.按下取資料後的狀態。
https://ithelp.ithome.com.tw/upload/images/20180111/201072998aYTQpCqj5.png

以上就是今天的介紹,明天我們又會針ui 畫面做一些介紹。

ref:
day25原始碼


上一篇
【24】當老闆想了想問:可是有時候資料是分段處理的,這時候該怎麼使用shiny 處理呢?
下一篇
【26】當老闆扎了三下眼問:那可以直接在shiny 上顯示k-means 分類後的地圖嗎?
系列文
你都在公司都在幹啥R? R語言資料分析經驗分享30

1 則留言

0
Mos
iT邦新手 5 級 ‧ 2018-01-11 23:04:03

blink blink

我要留言

立即登入留言