Shiny包的特點(diǎn)在于不需要了解網(wǎng)頁(yè)語(yǔ)言,可以用純R來搭建。生成的網(wǎng)頁(yè)應(yīng)用是動(dòng)態(tài)交互,而且是即時(shí)更新的。Shiny還提供了現(xiàn)成組件方便快速在網(wǎng)頁(yè)上展示數(shù)據(jù)、圖表和模型,的確是非常的炫。
首先安裝Shiny包:
options(repos = c(RStudio = 'http://rstudio.org/_packages', getOption('repos')))
install.packages('shiny')
install.packages('digest')
install.packages('htmltools')
install.packages('httpuv')
再寫兩個(gè)R代碼文件:一個(gè)是負(fù)責(zé)前端的ui.R,另一個(gè)是負(fù)責(zé)后端的server.R。
library(httpuv)
library(htmltools)
library(digest)
library(shiny)
library(ggplot2)
shinyUI(bootstrapPage(
selectInput(inputId = "n_breaks",
label = "Number of bins in histogram (approximate):",
choices = c(10, 20, 35, 50),
selected = 20),
checkboxInput(inputId = "individual_obs",
label = strong("Show individual observations"),
value = FALSE),
checkboxInput(inputId = "density",
label = strong("Show density estimate"),
value = FALSE),
plotOutput(outputId = "main_plot", height = "300px"),
# Display this only if the density is shown
conditionalPanel(condition = "input.density == true",
sliderInput(inputId = "bw_adjust",
label = "Bandwidth adjustment:",
min = 0.2, max = 2, value = 1, step = 0.2)
)
))
server.R的代碼如下:
library(shiny)
library(ggplot2)
shinyServer(function(input, output) {
output$main_plot <- renderPlot({
hist(faithful$eruptions,
probability = TRUE,
breaks = as.numeric(input$n_breaks),
xlab = "Duration (minutes)",
main = "Geyser eruption duration")
if (input$individual_obs) {
rug(faithful$eruptions)
}
if (input$density) {
dens <- density(faithful$eruptions,
adjust = input$bw_adjust)
lines(dens, col = "blue")
}
})
})
將這兩個(gè)代碼文件存放到同一個(gè)文件夾下,例如我是放在在"C:/Users/cdas3/Documents/R/R-program/shiny-app"。最后在控制臺(tái)下運(yùn)行:
library(shiny)
runApp("C:/Users/cdas3/Documents/R/R-program/shiny-app")
之后R會(huì)自動(dòng)打開系統(tǒng)默認(rèn)的瀏覽器,并展示出如下的界面。
R-shiny.png
Shiny包的缺點(diǎn):在部署分享方面,Shiny包只能在本地瀏覽器展示應(yīng)用。如果要分享給其它人的話,需要將R代碼傳到網(wǎng)盤或打包分發(fā),而對(duì)方也需要使用runApp命令來進(jìn)行本地展示。RStudio團(tuán)隊(duì)正在開發(fā)Shiny服務(wù)器構(gòu)架,讓使用者僅需要一個(gè)瀏覽器和網(wǎng)址就可以運(yùn)行網(wǎng)頁(yè)應(yīng)用。不過這將是一個(gè)收費(fèi)的服務(wù)。