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