专栏首页优雅R「R」Shiny:用户界面(一)输入控件

「R」Shiny:用户界面(一)输入控件

前面几篇文章我们构建了一个简易的 Shiny 应用,如果我们仔细观察过没有几行的实现代码就知道 Shiny 将前端(实现用户界面)和后端(服务逻辑)进行了分离,这让我们可以比较独立地来看待它们。接下来的几篇文章会关注前端,探索 Shiny 提供的 HTML 输出、输出和页面布局功能。

首先依旧载入 Shiny。

library(shiny)

输入控件的通用结构

所有的输入(控件)函数第 1 个参数都是相同的 inputId。它是用来连接前端和后端的标识符(ID):如果你的 UI 有一个输入控件的 ID 是 "name",那么你可以在后端中使用 input$name 访问它

inputId 有两处限制:

  • 必须是合法的变量名。
  • 必须唯一。

大多数的输入函数的第 2 个参数是 label,它用于为控件创建可读的标签。它就没有限制了,尽量让大家看得懂该控件的含义即可。

第 3 个参数一般是 value,它用于设定默认的控件值。

其他的参数一般每个控件都不太相同,需要根据情况和文档说明进行设定。

根据上面的介绍,我们一般在实际使用时会忽略第一个和第二个参数名,如:

sliderInput("min", "Limit (minimum)", value = 50, min = 0, max = 100)

下面将大体根据创建的控件类型介绍内建于 Shiny 包的输入控件函数,目的是帮助各位读者快速地对整体的功能有所了解,而不是详细地描述所有的参数。如果你想要了解每个输入函数的详情,请阅读相应的函数文档。

自由文本

这里介绍 3 个函数用于文本的输入。

ui = fluidPage(
  ## 适用于少量文本
  textInput("name", "What's your name?"),
  ## 适用于密码
  passwordInput("password", "What's your password?"),
  ## 适用于成段文本
  textAreaInput("story", "Tell me about yourself", rows = 3, cols = 80)
)

server = function(input, output, session) {
  
}

shinyApp(ui, server)

如果你想要确保文本含有指定的属性,可以使用 validate() 函数(后续内容会介绍)。

数值输入

如果想要收集数值型数据,使用 sliderInput() 创建 1 个滑块,或使用 numericInput() 创建一个受限文本框。当 silerInput()value 参数值长度为 2 时,会产生一个范围滑块。

ui = fluidPage(
  ## 创建
  numericInput("num", "Number one",
               value = 0, min = 0, max = 100),
  ## 创建简单滑块
  sliderInput("num2", "Number two",
              value = 50, min = 0, max = 100),
  ## 创建范围滑块
  sliderInput("rng", "Range",
              value = c(10, 20), min = 0, max = 100)
)

shinyApp(ui, server)

一般当数值不那么重要时使用滑块,因为滑动选择一个指定值的体验比较糟糕。

自定义滑块,请阅读:https://shiny.rstudio.com/articles/sliders.html

日期

使用 dataInput() 创建单个日期,使用 dateRangeInput() 创建日期范围。参数 datesdisableddaysofweekdisabled 允许我们对合理输入进行限制。

ui = fluidPage(
  ## 创建单个日期
  dateInput("dob", "When were you born?"),
  ## 创建日期范围
  dateRangeInput("holiday", "When do you want to go on vacation next?")
)

shinyApp(ui, server)

默认的日期格式、语言等使用的是美国标准,它们可以通过参数 formatlanguageweekstart 等进行修改。

ui = fluidPage(
  dateInput("dob", "When were you born?", language = "zh-CN"),
  dateRangeInput("holiday", "When do you want to go on vacation next?", language = "zh-CN")
)

shinyApp(ui, server)

选择列表

selectInput()radioButtons() 是两种不同的创建选择列表方法。

animals = c("dog", "cat", "mouse", "bird", "other", "I hate animals")

ui = fluidPage(
  selectInput("state", "What's your favourite state?", choices = state.name),
  radioButtons("animal", "What's your favourite animal?", choices = animals)
)

shinyApp(ui, server)

单选按钮有两个很好的特点:

  • 展示了所有可能选项,非常适用于短列表
  • 可以展示非文字的内容,如表情
ui = fluidPage(
  radioButtons("rb", "Choose one:",
               choiceNames = list(
                 icon("angry"),
                 icon("smile"),
                 icon("sad-tear")
               ),
               choiceValues = list("angry", "happy", "sad")
  )
)

shinyApp(ui, server)

使用 selectInput() 创建的下拉列表由于所占的空间固定,非常适用于长列表。如果设定了 multiple = TRUE,还支持多选。

ui <- fluidPage(
  selectInput(
    "state", "What's your favourite state?",
    choices = state.name,
    multiple = TRUE
  )
)

shinyApp(ui, server)

如果想要使用按钮创建多选列表,需要用到 checkboxGroupInput()

ui = fluidPage(
  checkboxGroupInput("animal", "What's your favourite animal?",
                     choices = animals)
)

shinyApp(ui, server)

如果你想要一个应对 Yes/No 问题的复选框,使用 checkboxInput()

ui = fluidPage(
  checkboxInput("cleanup", "Clean up?", value = TRUE),
  checkboxInput("shutdown", "Shutdown?")
)

shinyApp(ui, server)

文件上传

使用 fileInput() 设定文件上传。

ui = fluidPage(
  fileInput("upload", NULL)
)

shinyApp(ui, server)

文件上传需要后端进行特殊的处理,这会在后面的内容中介绍。如果你里面想要用到它,不妨参考 https://github.com/rstudio/shiny-examples/blob/master/009-upload/app.R 提供的示例 Shiny App。

动作按钮

该特性使用 actionButton()actionLink() 实现,它一般配对后端的 observeEvent()eventReactive() 使用,后续介绍。

ui = fluidPage(
  actionButton("click", "Click me!"),
  actionButton("drink", "Drink me!", icon = icon("cocktail"))
)

shinyApp(ui, server)

本文分享自微信公众号 - 优雅R(elegant-r),作者:王诗翔

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-02-20

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 「R」简单理解lapply,sapply,vapply

    在我之前转载的文章《apply,lapply,sapply用法探索》中已经对R中apply家族函数进行了比较详细地说明,这篇文章基于我在data campus中...

    王诗翔呀
  • 「R」Shiny:响应式编程(一)server 函数

    在前面的文章中,我们介绍了如何创建用户界面。现在我们将内容转向对于 Shiny 服务端的讨论,它会让我们在运行时中使用R代码让用户界面栩栩如生。

    王诗翔呀
  • 「R」Shiny:用户界面(二)输出控件

    UI 中的输出控件创建了占位符,它随后被后端函数生成的内容所填充。与输入控件一样,输出控件的第 1 个参数也是一个唯一的 ID:如果你的 UI 有一个输入控件的...

    王诗翔呀
  • 企业必须进入云端吗?可以进入边缘计算

    如今物联网的应用越来越广泛,但需要具有企业的视角。这意味着垂直行业应用程序、开发生态系统、产品设计、硬件、部署等。

    静一
  • 避免云中断和提高系统性能的4种方法

    当大多数人听到关于云计算中断的头条新闻时,他们通常考虑的是哪个云计算供应商,或其负面宣传将如何影响股票价格,却很少有人会想到事件背后的相关人员,也就是负责修复问...

    静一
  • 全球最大市值20家公司更替,下一轮市场机遇在哪?

    19世纪的创业机会集中于欧洲市场和传统行业,20世纪的创业机会集中于美国市场和IT行业,21世纪的创业机会集中于中国市场和互联网新兴行业。

    华章科技
  • 如何构建一个 AI 问答系统:从生物进化的角度开始讨论

    作者:蔡政 导语: 无论是几十纳米的病毒, 几十微米的叶绿体, 几十毫米的蜜蜂,都会使用各自的"语言"。语言都是一种自然"沟通手段".,通过语言, 可以影响其...

    serena
  • R语言知识体系概览

    1. R的知识体系结构 R语言是一门统计语言,主要用于数学建模、统计计算、数据处理、可视化 等几个方向,R语言天生就不同于其他的编程语言。R语言封装了各种基础学...

    小莹莹
  • 拒绝无聊,如何让AI学会“花式聊天”?对抗学习在聊天回复生成中的曲折探索

    【数说君导读】 生成式对抗网络(GAN),不仅可以用于生成图像(除马赛克,你懂的),还可以用在自动聊天模型上。跟机器人聊天,你也许最怕听到类似 “我也这么觉得...

    数说君
  • C语言集成开发环境使用小记

    时隔6年,我又重操C语言,是什么让我如此再下定决心?就是不想让自己所学过的知识就此荒废了,我重新以一个C语言初学者的身份(当然,稍稍有点基础,以前的知识忘得没这...

    用户4645519

扫码关注云+社区

领取腾讯云代金券