R语言Web开发框架shiny包快速入门

浏览: 4494

    最近几年关于利用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)。

    图1.png

    你可以在一个目录中保存一个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)

    图2.png

    shinydashboard扩展包为shiny框架提供了BI框架,一个dashboard由三部分组成:标题栏、侧边栏、主面板。通过install.packages(“shinydashboard”)完成安装。执行以下脚本可以得到shinydashboard的基本框架。

    # ui.R
    library(shiny)
    library(shinydashboard)
    dashboardPage(
    dashboardHeader(),
    dashboardSidebar(),
    dashboardBody()
    )
    #server.R
    shinyServer(function(input,output){

    })

    图3.png

    接下来,我们就对这个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){
    })

    创建的应用如下图所示。

    图4.png

    这些控件可以添加在侧边栏,其实也可以在主面板添加,各位看官可以自己尝试。除了这两个控件外,shiny还有很多有用的控件,如下图所示。

    图5.png

    另外,我们还可以在shiny应用中很轻易添加HTML 内容。

    图6.png

    比如说,我们现在想在应用中的侧边栏添加一个天善的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){
    })

    图7.png

    接下来,我们通过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)
      })
    })

    图8.png

    在主面板我们生成了一幅散点图,我们可以根据选择的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)])
      })
    })

    Clipboard Image.png

    至此,利用shiny框架搭建的一个简易的app应用就完成了(大家可以直接复制最后的代码到本地运行app应用)。

    希望以上的简单分享能给大家一定的启发,更多的知识可以查看shiny的官方学习资料,或者点击应用中天善智能logo,跳转到R语言十三式查看详细内容,在第十二章会详细介绍shiny及shinydashboard包,并通过实际行业案例分享让大家全面掌握相关知识。^_^



      推荐 9
      本文由 谢佳标 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
      转载、引用前需联系作者,并署名作者且注明文章出处。
      本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

      15 个评论

      谢老师的课程讲的很好,转了
      谢谢你的支持,以后会持续发一些原创文章
      又可以学习新的知识啦,谢谢老师
      真是学不完的知识
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      老师有shiny应用课程的PPT吗
      是录播视频对应的课件吗?

      要回复文章请先登录注册