分享

「R shiny基础」在shiny应用中加载数据和脚本

 生物_医药_科研 2019-02-03

在上一节「R shiny基础」交互式入门, 我们实现了简单的用户交互。这一篇将会在之前的基础上,以对美国的人口普查结果进行可视化为例讲解如何通过从外部加载数据和脚本,实现更加复杂的操作。

加载数据和脚本

在app.R的同级路径下创建'census-app'文件夹。之后进入该文件夹创建data文件夹,之后下载counties.rds数据到此文件夹中

readRDS读取rds类型数据,数据内容为州名、人口数,不同种群人的比例。

  1. conties <> readRDS('census-app/data/counties.rds')

下载helpers.R和app.R同级,该脚本用于从之前的数据中进行绘图。鉴于该脚本依赖于 mapsmapproj这两个R包,你需要在使用之前进行安装。

source加载R脚本,以及用library依赖包

  1. library(map)

  2. library(mapproj)

  3. source('census-app/helpers.R')

脚本里面就一个 percent_map函数,支持五个参数,分别为可视化列,颜色,标题,阴影大小下限,阴影大小上限。

  1. percent_map(counties$white, 'darkgreen', '% White')

效果图如下:

代码执行

在shiny应用中,不同部分的代码的执行次数不同,规律如下:

  • 启动应用时,Shiny会运行一次所有的代码

  • 每有一个新的用户运行你的shiny应用,就会运行一次 server函数,保证每个用户有不同的响应式对象(reactivate object)

  • 每次用户进行交互时,render部分的代码都会运行一次

因此,对于数据加载和代码加载的代码应该放在 server函数外,仅仅将那些用户交互时才需要发生变更的代码放在render函数的表达式中。

结果

现在,我们就可以构建出一个能够根据用户选择,然后展示结果的Shiny应用了。

版本一:

  1. library(shiny)

  2. library(maps)

  3. library(mapproj)

  4. source('census-app/helpers.R')


  5. counties <> readRDS('census-app/data/counties.rds')


  6. ui <> fluidPage(

  7.  titlePanel('censusVis'),


  8.  sidebarLayout(

  9.    sidebarPanel(

  10.      helpText('Create demographic maps with

  11.               information from the 2010 US Census.'),


  12.      selectInput('var',

  13.                  label = 'Choose a variable to display',

  14.                  choices = c('Percent White' = 'white',

  15.                              'Percent Black' = 'black',

  16.                              'Percent Hispanic' = 'hispanic',

  17.                              'Percent Asian' = 'asian'),

  18.                  selected = 'Percent White'),


  19.      sliderInput('range',

  20.                  label = 'Range of interest:',

  21.                  min = 0, max = 100, value = c(0, 100))

  22.      ),


  23.    mainPanel(

  24.      plotOutput(outputId = 'selectVar')

  25.    )

  26.  )

  27.  )


  28. # Define server logic required to draw a histogram

  29. server <> function(input, output) {

  30.  output$selectVar <> renderPlot({

  31.    percent_map(counties[,input$var],

  32.                'darkgreen',

  33.                paste0('% ', input$var),

  34.                input$range[1],

  35.                input$range[2])


  36.  })


  37. }


  38. }


  39. # Run the application

  40. shinyApp(ui = ui, server = server)

版本二:在表达式中用switch函数,而不是在selectInput定义键值关系

  1. ...

  2.      selectInput('var',

  3.                  label = 'Choose a variable to display',

  4.                  choices = c('Percent White', 'Percent Black',

  5.                              'Percent Hispanic', 'Percent Asian'),

  6.                  selected = 'Percent White')

  7. ...


  8. server <> function(input, output) {

  9.  output$map <> renderPlot({

  10.    data <> switch(input$var,

  11.                   'Percent White' = counties$white,

  12.                   'Percent Black' = counties$black,

  13.                   'Percent Hispanic' = counties$hispanic,

  14.                   'Percent Asian' = counties$asian)


  15.    legend <> switch(input$var,

  16.                     'Percent White' = '% White',

  17.                     'Percent Black' = '% Black',

  18.                     'Percent Hispanic' = '% Hispanic',

  19.                     'Percent Asian' = '% Asian')


  20.    percent_map(data, 'darkgreen', legend, input$range[1], input$range[2])

  21.  })

  22. }

版本三: 用 do.call简化版本二的代码。

  1. server <> function(input, output) {

  2.  output$map <> renderPlot({

  3.    args <> switch(input$var,

  4.      'Percent White' = list(counties$white, 'darkgreen', '% White'),

  5.      'Percent Black' = list(counties$black, 'black', '% Black'),

  6.      'Percent Hispanic' = list(counties$hispanic, 'darkorange', '% Hispanic'),

  7.      'Percent Asian' = list(counties$asian, 'darkviolet', '% Asian'))


  8.    args$min <> input$range[1]

  9.    args$max <> input$range[2]


  10.    do.call(percent_map, args)

  11.  })

  12. }

总结

这一节学习了

  • 在Shiny应用中加载数据和代码

  • Shiny应用不同部分代码的运行次数

  • Switch函数和 selectInput通常一块使用。

下一节主要学习构建模块化,快速运行的Shiny应用的一些技巧。

传送门

Shiny基础教程:

  • 「R shiny 基础」初识Shiny

  • 「R shiny 基础」如何进行网页布局

  • 「R shiny基础」增加一些小控件

  • 「R shiny基础」交互式入门

  • 「R shiny基础」在shiny应用中加载数据和脚本

  • 「R shiny基础」reactive让shiny应用运行速度变快


    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多