您好,登錄后才能下訂單哦!
最近幾年關于利用shiny做web框架的需求越來越多,出去交流也經常有愛好者咨詢如何學習shiny包(個人覺得RStuido官網的shiny學習資料是最快上手的途徑之一)。今天晚上剛好給學員直播完shiny包的基本知識,順便也寫一篇關于shiny的掃盲文章出來,希望能對想學習shiny包的朋友有一點點啟發。
Shiny是R中的一種Web開發框架,使得R的使用者不必太了解css、js只需要了解一些html的知識就可以快速完成web開發,且shiny包集成了bootstrap、jquery、ajax等特性,極大解放了作為統計語言的R的生產力。
Shiny應用包含連個基本的組成部分:一個是用戶界面腳本(a user-interface script),另一個是服務器腳本(a server script)。
你可以在一個目錄中保存一個ui.R文件和server.R文件來創建一個Shiny應用。運行應用的方法是在函數runApp中置入目錄名稱。例如你的應用目錄名稱為myapp,且放在D盤目錄下,那么鍵入以下代碼可以執行應用:
library(shiny)
runApp("D:/myapp")
也可以將ui和server代碼寫在一個腳本內,通過shinyApp執行該app。運行以下腳本將得到一個簡單的web版直方圖。
library(shiny)
ui <- fluidPage(
numericInput(inputId = "n",
"Sample size", value = 25),
plotOutput(outputId = "hist")
)
server <- function(input, output) {
output$hist <- renderPlot({
hist(rnorm(input$n))
})
}
shinyApp(ui = ui, server = server)
shinydashboard擴展包為shiny框架提供了BI框架,一個dashboard由三部分組成:標題欄、側邊欄、主面板。通過install.packages(“shinydashboard”)完成安裝。執行以下腳本可以得到shinydashboard的基本框架。
# ui.R
library(shiny)
library(shinydashboard)
dashboardPage(
dashboardHeader(),
dashboardSidebar(),
dashboardBody()
)
#server.R
shinyServer(function(input,output){
})
接下來,我們就對這個BI基本框架,來豐富我們的應用。
現在,可以增加標題欄的標題,通過dashboardHeader中的title參數設置。且可以通過將disable參數設置為TRUE,隱藏標題欄,同理也可以通過此參數設置來隱藏側邊欄。并在側邊欄添加兩個下拉框控件(selectInput函數),一個數字輸入框(numericInput函數)。
# ui.R
library(shiny)
library(shinydashboard)
dashboardPage(
dashboardHeader(title="Iris k-means clustering"),
dashboardSidebar(
selectInput("xcol","X Variable",names(iris)),
selectInput("ycol","Y Variable",names(iris),selected="Sepal.Width"),
numericInput("clusters","Cluster count",3,min=2,max=9)
),
dashboardBody()
)
#server.R
shinyServer(function(input,output){
})
創建的應用如下圖所示。
這些控件可以添加在側邊欄,其實也可以在主面板添加,各位看官可以自己嘗試。除了這兩個控件外,shiny還有很多有用的控件,如下圖所示。
另外,我們還可以在shiny應用中很輕易添加HTML 內容。
比如說,我們現在想在應用中的側邊欄添加一個天善的logo,只需要添加img命令即可,但是請確保你的圖片是放在應用下面一個以www命名的文件夾中。要實現超鏈接的話,可以利用a命令,點擊天善logo的話將鏈接到R語言十三式的網址。
#ui.R
library(shiny)
library(shinydashboard)
dashboardPage(
dashboardHeader(title="Iris k-means clustering"),
dashboardSidebar(
selectInput("xcol","X Variable",names(iris)),
selectInput("ycol","Y Variable",names(iris),selected="Sepal.Width"),
numericInput("clusters","Cluster count",3,min=2,max=9),
a(img(src="logo.png",height=60,width=200),
href="https://www.hellobi.com/event/137",target="black")
),
dashboardBody()
)
#server.R
shinyServer(function(input,output){
})
接下來,我們通過kmeans函數對鳶尾花數據集進行K均值聚類,centers設置為Cluster count選擇的數值(input$centers),然后繪制聚類后的散點圖,散點圖的x軸的變量為X Variable(input$xcol),y軸的變量為Y Variable(input$ycol),并用每個樣本所屬的類別顏色進行區分;最后添加相應的類中心,用“*”表示。
# ui.R
library(shiny)
library(shinydashboard)
dashboardPage(
dashboardHeader(title="Iris k-means clustering"),
dashboardSidebar(
selectInput("xcol","X Variable",names(iris)),
selectInput("ycol","Y Variable",names(iris),selected="Sepal.Width"),
numericInput("clusters","Cluster count",3,min=2,max=9),
a(img(src="logo.png",height=60,width=200),
href="https://www.hellobi.com/event/137",target="black")
),
dashboardBody(
plotOutput("plot")
)
)
# server.R
shinyServer(function(input,output){
# 進行K均值聚類
cluster <- reactive({
kmeans(iris[,1:4],input$clusters)
})
# 繪制聚類結果
output$plot <- renderPlot({
plot(iris[,c(input$xcol,input$ycol)],
col=cluster()$cluster)
points(cluster()$centers[,c(input$xcol,input$ycol)],
col=1:input$clusters,pch="*",cex=4)
})
})
在主面板我們生成了一幅散點圖,我們可以根據選擇的Cluster count值改變聚類的中心數,從而查看不同類別數的散點圖結果。也可以改變X軸、Y軸的變量查看新的桑拿點圖分布。
細心的看官已經發現,我們默認生成的圖形是填充了整個主面板寬度(列寬是12)。如果我們想進行調整,例如想一半的寬度放置散點圖,另一半的寬度放置選擇的數據表,此時我們可以通過column函數實現。
# ui.R
library(shiny)
library(shinydashboard)
dashboardPage(
dashboardHeader(title="Iris k-means clustering"),
dashboardSidebar(
selectInput("xcol","X Variable",names(iris)),
selectInput("ycol","Y Variable",names(iris),selected="Sepal.Width"),
numericInput("clusters","Cluster count",3,min=2,max=9),
a(img(src="logo.png",height=60,width=200),
href="https://www.hellobi.com/event/137",target="black")
),
dashboardBody(
column(6,plotOutput("plot")),
column(6,DT::dataTableOutput("data"))
)
)
# server.R
shinyServer(function(input,output){
# 進行K均值聚類
cluster <- reactive({
kmeans(iris[,1:4],input$clusters)
})
# 繪制聚類結果
output$plot <- renderPlot({
plot(iris[,c(input$xcol,input$ycol)],
col=cluster()$cluster)
points(cluster()$centers[,c(input$xcol,input$ycol)],
col=1:input$clusters,pch="*",cex=4)
})
# 展示選擇列的數據集
output$data <- DT::renderDataTable({
DT::datatable(iris[,c(input$xcol,input$ycol)])
})
})
至此,利用shiny框架搭建的一個簡易的app應用就完成了(大家可以直接復制最后的代碼到本地運行app應用)。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。