iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 28
1
Data Technology

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

【28】當行銷人員仍不滿足地問:之前也有很多分析,這些也可以全部放到一個shiny上嗎?

大家還記得鐵人賽一開始介紹使用的user.csv 和orders.csv 嗎? 今天要介紹的內容就是如何將這一整個分析放到shiny 上!,我們會用到的是navbarPage,我們就用範例來解釋吧。

navbarPage("App Title",
  tabPanel("Plot"),
  tabPanel("Summary"),
  tabPanel("Table")

navbarPage第一個參數是標題,後面可以接續許多tabPanel,所以換成我們的例子如下:

shinyUI(navbarPage("Shiny 大雜燴",
    tabPanel("地址分析",fluidRow(
        column(3, 
            h4("API抓取經緯度"),
            actionButton("request", "取資料"),
            hr(),
            numericInput("seed", h3("種子碼"), value = 20180112),
            numericInput("k_value", h3("k值"), value = 10),
            actionButton("do", "執行")
        ),
        column(9, 
            tabsetPanel(
                tabPanel("地址表單", tableOutput('addressTable')), 
                tabPanel("地址分佈圖", plotOutput("allAddressPlot", height = "800px")),
                tabPanel("K-means結果分佈圖", plotOutput("classifiedAddressPlot", height = "800px"))
            )
        )
    )),
    tabPanel("訂單分析"),
    tabPanel("會員分析")
))

呈現結果如下:

https://ithelp.ithome.com.tw/upload/images/20180114/20107299gvwW24ZNEv.png

所以直接在tabPanel第二個參數放上原本的畫面配置就可以達到我們的效果了。

再來我們再來寫訂單分析和會員分析的ui,訂單分析就和先前寫的過濾方式一樣。

tabPanel("訂單分析",fluidRow(
    column(3, 
        h4("過濾"),
        sliderInput('price', '價格多少以上',
                   min=0, max=12000, value=300,
                   step=100, round=0),
        selectInput('payment', '付款方式', c("信用卡", 
                                        "ATM轉帳", 
                                        "貨到付款", 
                                        "現金", 
                                        "無",
                                        "其他"))
    ),
    column(9, 
           tableOutput('ordersTable')
    )
))

https://ithelp.ithome.com.tw/upload/images/20180114/20107299pXTGTPtlXc.png

其對應的server程式碼如下:

output$ordersTable <- renderTable({
    orders %>%
        filter(input$price < PRICE, input$payment == PAYMENTTYPE)
})

再來會員的部分,我希望能做出電話過濾的效果,所以ui部分我這樣子寫。

tabPanel("會員分析",fluidRow(
    column(3, 
       h4("user資料"),
       textInput("phone_number", h3("手機號碼"), value = "")
    ),
    column(9, 
           tableOutput('userTable')
    )
))

https://ithelp.ithome.com.tw/upload/images/20180114/20107299tYzOAaTydD.png

其對應的server 程式碼為

output$userTable <- renderTable({
    if(input$phone_number=="") return(user)
    user %>%
        filter(str_detect(MOBILE, input$phone_number))
})

這就完成了,另外如果說頁籤太多,我們可以再用navbarMenu將分頁合起來,例如訂單分析和會員分析,我們合稱電子商務分析。

navbarMenu("電子商務分析",
   tabPanel("訂單分析",fluidRow(
       column(3, 
              h4("過濾"),
              sliderInput('price', '價格多少以上',
                          min=0, max=12000, value=300,
                          step=100, round=0),
              selectInput('payment', '付款方式', c("信用卡", 
                                               "ATM轉帳", 
                                               "貨到付款", 
                                               "現金", 
                                               "無",
                                               "其他"))
       ),
       column(9, 
              tableOutput('ordersTable')
       )
   )),
   tabPanel("會員分析",fluidRow(
       column(3, 
              h4("user資料"),
              textInput("phone_number", h3("手機號碼"), value = "")
       ),
       column(9, 
              tableOutput('userTable')
       )
   )
))

所產生的畫面如下:

https://ithelp.ithome.com.tw/upload/images/20180114/20107299Y0lhvLOCfP.png

以上就是今天的介紹,鐵人賽也接近尾聲了,希望這一系列的教學文大家可以接受!

ref:
day28原始碼


上一篇
【27】當行銷人員傻眼問:呃...工程師大大,為什麼按了取經緯度按鈕後程式好像就當掉了?
下一篇
【29】當老闆還是有問題的問:嗯嗯嗯!那我想問,如果我另外一台電腦也想使用shiny 來整理資料,他也要設定環境那些嗎?
系列文
你都在公司都在幹啥R? R語言資料分析經驗分享30

尚未有邦友留言

立即登入留言