Loading [MathJax]/jax/output/CommonHTML/jax.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >基于R语言的shiny网页工具开发基础系列-04

基于R语言的shiny网页工具开发基础系列-04

作者头像
生信技能树
发布于 2021-02-03 08:03:37
发布于 2021-02-03 08:03:37
7.7K00
代码可运行
举报
文章被收录于专栏:生信技能树生信技能树
运行总次数:0
代码可运行

后起之秀奔涌而至,欢迎大家在《生信技能树》的舞台分享自己的心得体会!

上面是shiny团队的稿件

l4-反应输出

了解小工具如何和反应输出联系,反应输出即无何时用户改变小工具都会自动更新的对象

展示反应输出

是时候给app注入灵魂了,此篇介绍如何构建一个反应输出在app中展示。

只要用户触发小工具,反应输出会自动响应

如下图,右边的两行文字会根据用户对小工具的操作改变

此篇创建一个名为census-app的app

总的两步

可以通过两步处理构建反应输出

  • 加一个R对象到你的用户界面
  • 告诉shiny如何在server函数构建对象,该对象会在它的代码构建一个小工具的值的时候反应

第一步:加一个R对象到UI

shiny提供了一个函数家族,将R对象转换成在UI中的输出,每个函数创建特定类型的输出

你能加输出到UI就像加HTML元素和widgets一样。将输出函数放在ui对象中的sidebarPanelmainPanel

例如,下面的ui对象使用textOutput 加反应文本行到上图app的主面板

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
ui <- fluidPage(
  titlePanel("censusVis"),
  
  sidebarLayout(
    sidebarPanel(
      helpText("Create demographic maps with 
               information from the 2010 US Census."),
      
      selectInput("var", 
                  label = "Choose a variable to display",
                  choices = c("Percent White", 
                              "Percent Black",
                              "Percent Hispanic", 
                              "Percent Asian"),
                  selected = "Percent White"),
      
      sliderInput("range", 
                  label = "Range of interest:",
                  min = 0, max = 100, value = c(0, 100))
    ),
    
    mainPanel(
      textOutput("selected_var")
    )
  )
)

可以注意到textOutput采用了一个字符串"selected_var"作为参数。每个*Output函数都需要一个参数:一个app将用作反应元素的名字的字符串。用户不可见,但后面会用到

第二步:提供构建对象的R代码

在ui中放一个函数告诉app在何处放置你的对象。接下来,需要告诉shiny如何构建对象

就是在server函数中提供构建对象的R代码

server函数在shiny的处理中扮演一个特别的角色,他会构建一个类似列表(list)的对象,被命名为output,包含所有用来更新app中R对象的代码,每个R对象在list中要有自己的条目(名字)

在server函数中,可以通过在output定义一个新元素来创建条目,如下,元素名字应该与ui中反应元素使用的参数一致

就像此处

output$selected_var 匹配ui中的 textOutput("selected_var")

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server <- function(input, output) {
  
  output$selected_var <- renderText({ 
    "You have selected this"
  })
  
}

在server中无需其他代码用来返回output的值,R将通过引用类语义(class semantics)自动更新output

output的条目都应该包含render* 函数家族中的某一个。这些函数捕捉R表达式,并进行一些渲染预处理,每个render*函数对应特定类型的反应对象,如下表

每个render *函数都有一个参数:一个用大括号{}括起来的R表达式。表达式可以是一行简单的文本,也可以包含很多行代码,就像是一个复杂的函数调用一样。

将此R表达式视为一组指令,您可以将它们提供给Shiny以便以后存储。首次启动应用程序时,Shiny会运行说明,然后每次需要更新对象时,Shiny都会重新运行说明。

将R表达式视为稍后于shiny的一组指令,当首次启动app时,shiny会运行这个指令,当每次需要更新对象时,shiny也会重新运行这个指令。

因此,表达式应该返回你期望的对象(文本,图,数据框等),当表达式不返回对象或错误的对西那个类型时会报错

使用小工具(widget)的值

当用上面的代码构建app后,会发现app长这样

文本不会对小工具作出反应

那应该怎么做呢

通过在构建文本时,让shiny调用小工具的值,从而实现文本反应

看一下代码发现,server函数的第一行有两个参数input和output

已知output是个列表类的对象,储存构建app中对象的指令

input是第二个列表类对象,会存储所有小工具的所有当前值,这些值会存在ui中对应的小工具中给出的name名下

例中app有两个小工具,一个name是"var",一个name是"range", 他们的值将分别存在input

range。因为滑块小工具有两个值,最大值和最小值,所以input$range 会包含一个长度为二的向量。

Shiny会自动让一个包含input值的对象反应,例如下面的server函数通过选择框小部件构建的文本,创建一个反应文本行

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
server <- function(input, output) {
  
  output$selected_var <- renderText({ 
    paste("You have selected", input$var)
  })
  
}

shiny 追踪哪个输出取决于是哪个小工具。

当用户改变小工具,shiny会使用新的值重建依赖于那个小工具的所有的输出,重建对象达到更新的目的

这就是如何用shiny创建反应,通过连接input列表中的值到output中的对象。shiny自动处理其他细节

启动你的应用看看反应输出

将上面的代码放到你的app中,可以使用runApp("census-app", display.mode = "showcase")运行app

看起来像下图,操作选择框的时候文本也会随之改变

在改变的时候,反应部分的代码甚至会变黄,有助于理解反应输出

练习

在上面的App加第二行反应文本,加到app的主面板,展示如 “You have chosen a range that goes from something to something” 其中something对应最大值和最小值

小提示,ui和server要都更新哦(记得一定要先自己做哦,不偷看答案)

回顾

  • 构建了第一个有灵魂的(能反应的)app
  • 在server中使用render*函数告诉Shiny如何构筑你的对象
  • 在每个render*函数中,用{}抱住R表达式
  • 将render* 表达式的结果保存到output列表,每个反应对象对应其中的一个条目
  • 通过在render*中的表达式包含一个input值来创建反应对象

我的结果( ?又对了)

我的代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(shiny)

ui <- fluidPage(
  titlePanel("censusVis"),

  sidebarLayout(
    sidebarPanel(
      helpText("Create demographic maps with
               information from the 2010 US Census."),

      selectInput("var",
                  label = "Choose a variable to display",
                  choices = c("Percent White",
                              "Percent Black",
                              "Percent Hispanic",
                              "Percent Asian"),
                  selected = "Percent White"),

      sliderInput("range",
                  label = "Range of interest:",
                  min = 0, max = 100, value = c(0, 100))
    ),

    mainPanel(
      textOutput("selected_var"),
      textOutput("maxandmin")
    )
  )
)

server <- function(input, output) {

  output$selected_var <- renderText({
    paste("You have selected", input$var)
  })

  output$maxandmin <- renderText({
    paste("You have chosen a range that goes from", input$range[1], "to", input$range[2])
  })

}

shinyApp(ui = ui,server = server)

参考答案

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
library(shiny)ui <- fluidPage(titlePanel("censusVis"),
  
  sidebarLayout(sidebarPanel(helpText("Create demographic maps with 
               information from the 2010 US Census."),
      
      selectInput("var", 
                  label = "Choose a variable to display",
                  choices = c("Percent White", 
                              "Percent Black",
                              "Percent Hispanic", 
                              "Percent Asian"),
                  selected = "Percent White"),
      
      sliderInput("range", 
                  label = "Range of interest:",
                  min = 0, max = 100, value = c(0, 100))),
    
    mainPanel(textOutput("selected_var"),
      textOutput("min_max"))))
server <- function(input, output) {
  
  output$selected_var <- renderText({paste("You have selected", input$var)})
  
  output$min_max <- renderText({paste("You have chosen a range that goes from",
          input$range[1], "to", input$range[2])})
  
}
shinyApp(ui, server)

Reference:

Shiny - Display reactive output

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2021-01-30,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 生信技能树 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
基于R语言的shiny网页工具开发基础系列-05
counties.rds是一个包含美国每个县人口统计数据的数据集,使用R包UScensus2010收集,也可从这下载
生信技能树
2021/02/03
1.8K0
基于R语言的shiny网页工具开发基础系列-05
Shiny学习(四)||响应式输出
Shiny应用程序中控件选中的值可以通过生成响应式输出来显示。用户切换控件的值,输出的文本也随着控件的值自动响应。 如下是两个小控件,分别用来展示 variable to display和Range of interest,此时选中是没有响应式输出。
生信编程日常
2020/05/18
1.8K0
基于R语言的shiny网页工具开发基础系列-03
上节已经学会在用户界面放置一些简单的元素,但显示更复杂的内容需要用到小部件widgets
生信技能树
2021/02/03
2.9K0
基于R语言的shiny网页工具开发基础系列-03
Shiny 基础
作为一个实例展示, Shiny 中内置了一些例子,我们可以通过运行 runExample() 来探索Shiny APP的结构:
王诗翔呀
2020/11/13
2.8K0
Shiny 基础
R海拾遗-shiny3
数据集:counties.rds是美国每个县的人口统计数据集,由UScensus2010 收集。需要另外下载 https://shiny.rstudio.com/tutorial/written-tutorial/lesson5/census-app/data/counties.rds 下载后是一个rds文件,需要在之前介绍的app文件夹中建立data文件,然后将数据集移动到data中 脚本:help.R: https://shiny.rstudio.com/tutorial/written-tutorial/lesson5/census-app/helpers.R 下载之后将脚本放入app文件夹中 代码
火星娃统计
2020/09/15
5920
R海拾遗-shiny3
Shiny-R语言轻松开发交互式web应用
Shiny是RStudio公司开发的新包,有了它,可以用R语言轻松开发交互式web应用。
生信交流平台
2020/08/06
2.3K0
Shiny-R语言轻松开发交互式web应用
shiny学习-2
使用这些控件需要两个参数,一个参数用来命名,一个参数是label,前一个被用来在程序内传递参数,后一个参数用来显示在用户界面 例子
火星娃统计
2020/09/15
2.2K0
shiny学习-2
用R-Shiny打造一个美美的在线App
最近迷上了动态可视化,突然发现shiny真是个好东西,能够将我之前所学都完美的结合在一起,形成一个集成的动态仪表盘! 今天做一个小小的案例,算是shiny动态可视化的小开端…… 这个案例是之前发过的中国人口结构动态金字塔图,这个图还是蛮不错,数据取自UN的官网,非常有现实意义的人口性别结构数据。 library(ggplot2) library(animation) library(dplyr) library(tidyr) library(xlsx) library(ggthemes) library(s
数据小磨坊
2018/04/11
1.3K0
用R-Shiny打造一个美美的在线App
Shiny学习(五)||使用R脚本和数据
建立一个census-app的目录,并在目录下新建data目录存储counties.rds文件,点击下载counties.rds
生信编程日常
2020/05/26
1.1K0
R︱shiny实现交互式界面布置与搭建(案例讲解+学习笔记)
版权声明:博主原创文章,微信公众号:素质云笔记,转载请注明来源“素质云博客”,谢谢合作!! https://blog.csdn.net/sinat_26917383/article/details/53410370
悟乙己
2019/05/26
9.3K0
基于R语言的shiny网页工具开发基础系列-06
StockVis 用R的quantmod包,如果没有应该安装install.packages("quantmod")
生信技能树
2021/02/03
4.2K0
基于R语言的shiny网页工具开发基础系列-06
获取股票信息的简单shiny接口
原文: http://supstat.com.cn/blog/2014/12/03/a-simple-shiny-interface-to-retrieve-stock-information/ 本文的作者是某国际知名制药公司在华研究中心的工程师,今年8月他们部门接受了我们的R语言培训,这篇文章就是培训后他做的presentation. 目标:通过数据的股票代码获取中国股票信息 这个项目以利用shiny获取和展示股票信息为目标。 数据准备 新浪是获取中国股票信息源数据的理想场所,我们可以利用下面的代码来得
机器学习AI算法工程
2018/03/13
2.1K0
获取股票信息的简单shiny接口
R语言shiny之导航栏(navbar)和侧边栏(sidebar)小例子
在Y叔的公众号看到文章**《有人基于AnnotationHub和clusterProfiler做了个shiny,就能支持1700+的物种,你却老是在问我,非模式生物怎么办!》**。正好自己最近在学习R语言的shiny。于是找到这个shiny的代码看了看,发现不是很长,花点时间应该可以重复出来。
用户7010445
2020/05/26
3.3K0
shiny入门课【1.简介】
shiny包内置了11个已经写好的应用,我们可以使用runExample命令来运行。
用户2936342
2019/06/16
9460
shiny入门学习路径
视频演示:http://mpvideo.qpic.cn/0bc37aadyaaanqaakvelqjrvb6gdht4aapaa.f10002.mp4? 1. 什么是Shiny? Shiny 是一个为
拴小林
2023/03/06
1.8K0
shiny入门学习路径
基于R语言的shiny网页工具开发基础系列-02
此篇旨在如何构建app对用户界面,如何布局用户界面然后加文字图片和其他HTML元素
生信技能树
2021/02/03
2.3K0
基于R语言的shiny网页工具开发基础系列-02
Shiny||文件的上传与下载
Shiny可以将用户的数据上传到到你的应用程序里。用户可以通过浏览器进行数据的上传,并且服务器端可以访问这些数据。 一般情况下,shiny上传的数据有文件大小有限制,一般不能超过5M。可以通过shiny.maxRequestSize选项来修改这个限制。例如,在server.R的最前面加上 options(shiny.maxRequestSize=30*1024^2),可以把文件大小限制提高到30MB。
生信编程日常
2020/05/28
3.5K0
基于R语言的shiny网页工具开发基础系列-07
你现在能构建一个实用的shiny app,但是如何分享给别人呢?此篇将展示几个分享app的方法
生信技能树
2021/02/03
3.1K0
基于R语言的shiny网页工具开发基础系列-07
基于R语言的shiny网页工具开发基础系列-01
执行 runExample()可以看到内置的11个例子,github上有更多,可以体验和学习这些例子
生信技能树
2021/02/03
2.4K0
基于R语言的shiny网页工具开发基础系列-01
「R」Shiny:响应式编程(三)响应表达式
前面我们已经快速接触了几次响应表达式,相信读者大致了解它是做什么的。本文将进一步深入学习这个知识点,展示为什么它对于构建网页应用很重要。
王诗翔呀
2020/07/03
1.7K0
相关推荐
基于R语言的shiny网页工具开发基础系列-05
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档