作为Shiny平台构建与R包开发教程的第二小节,本节向读者介绍如何利用Shiny server处理用户输入的各种信息。这些信息既包括用户向Shiny上传的数据集,也包括用户对Shiny页面的各种控件(Widget)发出的行为信号(e.g. 用户选中下拉列表框中的一个值,该值传送到server中进行后续数据处理)。本节涉及的两个内容为数据文件上传和Shiny Widget设计。

数据上传

我们希望设计一个控件,单击“Browser…”按钮,弹出选择文件对话框,让用户选择需要上传的数据文件,上传的数据用于后续分析。实现代码如下:

library(data.table)ui.data <- fluidPage(fileInput("data_input1", "Experiment:", accept = ".csv"),tableOutput('data_tbout1')
)server <- function(input, output){read.d1 <- reactive({inFile1 <- input$data_input1if (is.null(inFile1)) return(NULL)fread(inFile1$datapath)})output$data_tbout1 <- renderTable({dat1 <- read.d1()head(dat1)})
}shinyApp(ui.data, server)

备注:R语言函数末尾的值就是函数的返回值,代码中省略了return函数。

上述代码中,ui部分的核心是fileInput函数。fileInput创造了数据输入控件。该函数的第一个参数是控件的id,第二个参数是Shiny页面中需要显示的文字,第三个参数是接受的文件类型,案例中只接受.csv文件(但在我的电脑中并不管用)。tableOutput函数用于输出用户上传的数据,只是为了验证数据上传成功,其原理在下一节中会详细说明。

Server部分核心表达式是read.d1read.d1{}包裹,是一个表达式。并且该表达式在reactive函数中,表明它是一个“reactive表达式”。在Shiny中,一个“reactive表达式”会随着用户对服务器的操作而动态变化(a reactive expression is a expression whose result will change over time)。也就是说,用户上传数据,就相当于对服务器发出了一次操作,那么server函数里面所有的“reactive表达式”就要重新计算;用户在Shiny界面中选了下拉列表框中的一个值,也算对服务器发出了操作,所有“reactive表达式”也都要重新计算;用户选了一个radio button,用户拖动了slider bar,等等这些都是如此。事实上,服务器初始化也算一次事件,因此所有“reactive表达式”也要重新计算。只不过此时用户还没有上传数据,“input$data_input1”的计算结果为NULL,因此tableOutput区域当然也不会显示任何表格。而当用户在名为"data_input1"的控件中上传数据后,表达式read.d1需要重新计算,其中input$data_input1应该是上传的数据文件。随后用data.table包的fread函数将输入的.csv文件转化为data.frame形式。

此后,每次想调用上传的数据时,只需要使用read.d1()就可以读取并获得data.frame格式的数据表。

此外,用于数据输出的函数renderTable的第一个参数同样也是“reactive表达式”,只是没有用reactive函数显式说明。

控件设计

数据输入控件只是一个特殊的控件。事实上,多数控件的构造函数基本上都满足同一语法:shinyWidget(id, text, …)。其中第一个参数是该控件的id。服务器必须通过识别id值来确认用户是否对该空间发出了操作。text参数往往指定了控件上需要显示什么文字。其他参数则因控件而异。具体参数用法可以通过help函数进行查询。

这里推荐常用的Shiny控件网站:http://shinyapps.dreamrs.fr/shinyWidgets/。您可以在该网站中选择自己喜欢的控件,并将相应代码加入到自己的Shiny APP中,而用户对某一控件的选定值就等于input$控件的id。使用时注意引入shinyWidgets包。例如:

library(data.table)
library(shinyWidgets)ui <- fluidPage(awesomeCheckboxGroup(inputId = "Id001",label = "Checkboxes with status", choices = c("A", "B", "C"),inline = TRUE,status = "danger"),textOutput(outputId = "Out001")
)server <- function(input, output){output$Out001 <- renderText({input$Id001})}shinyApp(ui, server)

上一篇: Shiny平台构建与R包开发(一)——ui布局
下一篇: Shiny平台构建与R包开发(三)——数据输出


欢迎感兴趣的同行朋友们批评指正。
联系邮箱:hrwu_ecology@163.com

Shiny平台构建与R包开发(二)——数据输入相关推荐

  1. Shiny平台构建与R包开发(三)——数据输出

    作为Shiny平台构建与R包开发教程的第三小节,本节向读者展示如何利用Shiny server输出自己想要的数据,包括Rplot.Table.Text等信息. 数据输出机制 仍以上一节的案例为基础: ...

  2. Shiny平台构建与R包开发(一)——ui布局

    本节为Shiny平台构建与R包开发教程的第一小节. Getting Started 初识Shiny时,了解其工作机理非常重要.下面的案例展示了一个最简单的Shiny APP的工作机理: #DO NOT ...

  3. Shiny平台构建与R包开发

    Introduction 在数据库网页搭建教程中已经提到,数据分析决策平台的搭建十分重要.数据库网页是数据分析决策平台的重要表现形式之一,能够很好地将大量数据或其分析结果公开展示,并能提供数据下载.统 ...

  4. Shiny平台构建与R包开发(七)——Shiny APP部署

    本节展示了如何分享和部署Shiny APP.您可以将开发好的Shiny APP部署在自己的服务器上,或是将其部署在公共的平台(即shinyapps.io)上.这里仅分享后者.对于如何将Shiny AP ...

  5. Shiny平台构建与R包开发(五)——ui美化

    本节简单地向读者介绍Shiny APP中ui的美化方法. shinythemes 利用shinythemes包,您可以选择不同的bootstrap风格,并将其应用到Shiny APP中. 安装完shi ...

  6. Shiny平台构建与R包开发(四)——按钮与响应事件

    作为Shiny平台构建与R包开发教程的第四小节,本节向读者进一步强调Shiny server的工作机理,并由此设计按钮点击事件. Shiny server工作机理与问题 前面的几个小节已经向读者初步解 ...

  7. R包开发每日中国天气

    R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据的爆发,R语言变成了一门炙手可 ...

  8. R · R 包开发 | 保姆级教程

    R · R 包开发 一般在初始阶段我们都是使用别人的函数来完成大部分任务,那些函数大多来自 R 标准安装的包或者可以从 CRAN 下载的包. 安装新的包可以拓展 R 的功能.比如说,安装 ggplot ...

  9. RNA-seq流程学习笔记(14)-在windows10平台上利用R包合并表达矩阵、设置实验分组信息、列名及数据的导入导出

    参考文章: RNA-seq(6): reads计数,合并矩阵并进行注释 进入R学习和相关操作后,各种折腾已经快2周了,看了几个网站的教程,借了几本教科书,发现都是零零碎碎的知识.索性就按照之前的方法, ...

最新文章

  1. 嵌入式实现 微信网页版 群发信息。
  2. NLP这两年:15个预训练模型对比分析与剖析
  3. red hat关于桥接模式连不上外网或者没有IP
  4. 2014 I/O归来:Google连接一切
  5. 怎样让elementui表格里面的文字不换行,溢出隐藏,tooltip显示内容
  6. C++旋转二维MxN矩阵的算法(附完整源码)
  7. oracle之数据处理之约束1
  8. java的vector_java中的Vector类
  9. fastjson 序列化 不包括转义字符_fastjson再次发现漏洞,可能发生OOM导致宕机
  10. 应该如何做好持续集成和部署?
  11. 惠普服务器ssa找不到控制卡,DL380 Gen10服务器Vmware ESXi 6.0 系统SSACLI工具
  12. 图卷积网络详细介绍(一)
  13. 格雷码与二进制码的转换
  14. Java-面试-逻辑题
  15. goole搜索技巧(摘要)
  16. 关于ppp、PPPoE、PPTP、L2TP、IPSec协议的简单认识
  17. 可與言而不與之言,失人。不可與言而與之言,失言。知者不失人,亦不失言。
  18. 拍照爱摆“剪刀手”?呵呵,1.5米内100%还原指纹
  19. 华为认证云服务工程师(HCIA-Cloud Service)-- 练习题2
  20. 小尾巴微博html5版,小尾巴

热门文章

  1. 把Redis当作队列来用,真的合适吗?
  2. VM 与容器之争!Docker赢了!
  3. 面试官:说说一条查询sql的执行流程和底层原理?
  4. 万物生长,万物互联的时代来了
  5. Scrum敏捷开发工具实力推荐
  6. Java时间Calendar
  7. linux shell面试题(一)
  8. MVC控件类型-自定义控件
  9. 根据前序、中序序列重建一棵二叉树的代码实现
  10. Linux环境下编写一个shell程序,此程序的功能:随机生成一个1-100的数(答案)让用户猜