首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
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

varinput

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 删除。

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

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
迁移到 Go Modules
Go 项目使用多种依赖管理策略,其中对 vendor 包的管理有两个比较流行的工具 dep 和 glide,但他们在行为上有很大的差异,而且并不是总能很好地同时使用。一些项目将其整个 GOPATH 目录存储在一个 Git 仓库中。其他人则只依赖于 go get 并期望在GOPATH中安装较新版本的依赖项。
恋喵大鲤鱼
2020/09/08
8890
2019年8月21日 Go生态洞察:迁移到Go模块
🐯 嗨,猫头虎博主在此!今天我们将探索2019年8月21日发布的Go生态系列文章的第二部分,专注于迁移到Go模块。Go模块是Go 1.11中引入的官方依赖管理解决方案,本文将详细介绍如何将项目转换为模块。无论您是初次接触Go模块还是寻求深入理解,这篇文章都将为您提供宝贵的洞见。🔍
猫头虎
2024/04/08
1330
2019年8月21日 Go生态洞察:迁移到Go模块
Go Modules 详解
Go 1.11 和 Go 1.12 包含了初步的 Go Modules 支持,且计划在 2019 年 8 月发布的 Go 1.13 会在所有开发过程中默认使用 Go Modules。
码农编程进阶笔记
2021/07/20
9360
Go Modules 详解
Go 模块--开始使用Go Modules
Go的1.11和1.12版本包括对模块--新的Go依赖管理系统的初步支持,使依赖版本信息变得明确且更易于管理。这篇博客文章介绍了开始使用模块所需的基本操作。
KevinYan
2020/01/14
2.7K0
Golang Module的使用 顶
注意:go mod 还有一些其他比较有意思的工具,比如可以打印依赖树,比如可以查看哪些模块在哪些包引用了
BGBiao
2019/09/09
1.3K0
Go语言重新开始,Go Modules的前世今生与基本使用
2020年腾讯内部的一份开发者报告显示,Go语言已经成为腾讯内部第二大后端开发语言,在腾讯每天有大量的Go开发者在做业务和平台开发,大量的团队和项目使用也暴露出一些问题,随着Go Modules的出现,类似于内部自签发证书、安全审计等这些问题也逐渐得到解决。 笔者在腾讯当前负责腾讯云在Go编程语言使用上的一些问题,2021年初开始负责内部goproxy服务并推广Go Modules使用,这些技术支撑了腾讯云、微信、腾讯视频、腾讯游戏、腾讯音乐、腾讯会议等明星产品,并与公司内部软件源团队、工蜂团队、
腾讯云开发者
2021/11/25
7150
Go mod的简单实践
Go mod简介: Go mod是官方推荐的包管理方式,开始于go1.11,在go1.12版本基本稳定,go1.13之后开始默认开启。
灰子学技术
2020/05/20
10.5K0
Go编程之相关命令工具记录
该命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装,整个过程类似安装App一样;
全栈工程师修炼指南
2022/09/29
6730
Go语言重新开始,Go Modules 的前世今生与基本使用
2020 年腾讯内部的一份开发者报告显示,Go 语言已经成为腾讯内部第二大后端开发语言,在腾讯每天有大量的 Go 开发者在做业务和平台开发,大量的团队和项目使用也暴露出一些问题,随着 Go Modules 的出现,类似于内部自签发证书、安全审计等这些问题也逐渐得到解决。
Bain
2021/11/02
8150
Go语言重新开始,Go Modules 的前世今生与基本使用
Go Modules 终极入门
Go modules 是 Go 语言中正式官宣的项目依赖解决方案,Go modules(前身为vgo)于 Go1.11 正式发布,在 Go1.14 已经准备好,并且可以用在生产上(ready for production)了,Go 官方也鼓励所有用户从其他依赖项管理工具迁移到 Go modules。
madneal
2020/03/10
2K0
Go Modules 终极入门
跳出Go module的泥潭
Go 1.11 前天已经正式发布了,这个版本包含了两个最重要的feature就是 module和web assembly。虽然也有一些简单的教程介绍了go module的特性,但是基本上都是hello world的例子,在实践的过程中, 很多人都在“拼命的挣扎”,包括我自己, 从一些qq群、github的issue, twitter上都可以看到大家茫然或者抱怨的语句。
李海彬
2018/09/29
1.7K0
跳出Go module的泥潭
发布 Go Modules
请注意:这篇文章涵盖了 v1 及其之前的开发,如果您对 v2 感兴趣,请参阅 Go Modules: v2 and Beyond。
恋喵大鲤鱼
2020/09/16
8400
Go modules基础精进,六大核心概念全解析(下)
在上篇中,我们介绍了模块路径、版本号与兼容性原则、伪版本号三大概念,而在下篇我们将会继续介绍Go Modules核心概念。
Bain
2021/12/06
7530
Go modules基础精进,六大核心概念全解析(下)
Go的包管理工具(三):Go Modules
在前面的文章,我们先是介绍了Go 的几种包管理方式,然后具体介绍了一种包管理的工具:glide。随着 Go 1.11 的发布,官方的包管理工具 Go Modules 变得流行起来。在发布不久的 Go 1.12 版本中,增强了对 Go Modules 的支持。本文将会介绍如何在项目中安装和使用 Go Modules 。
aoho求索
2019/05/07
1.6K0
2019年3月19日 Go生态洞察:使用Go模块
🐆 猫头虎博主来了!今天,我们将探索Go语言的一个重要特性——Go模块。在这篇文章中,我将深入解析Go模块的使用方法,并提供一些实际的代码示例。如果你正在搜索如何有效管理Go项目的依赖关系,那么你来对地方了!让我们一起深入Go的世界,探索其模块化的魅力!🚀
猫头虎
2024/04/08
1390
2019年3月19日 Go生态洞察:使用Go模块
GoLang 新版包管理 -- go module 的使用
上一篇文章中,我们介绍了 GoLang 中包的使用与包管理机制。 GoLang 包的使用与管理
用户3147702
2022/06/27
2.5K0
GoLang 新版包管理 -- go module 的使用
GO 依赖管理工具go Modules(官方推荐)
以前写过一篇关于go管理依赖包工具 dep的文章,当时认为dep将会成为官方依赖工具,现在看来是自己图样图斯内幕破了,正如官方一直提到dep是“official experiment”官方实验项目的那样,随着go modules 在go1.11版推出,go1.12版功能不断改进,再到go1.13版完善优化,正式扶正。预计dep将来也只能定格在“official experiment”了。
孤烟
2020/09/27
1.8K1
Go 编程 | 连载 21 - Go Modules 和 Package
GOPATH 是 Go 语言中使用的一个环境变量,它使用绝对路径提供项目的共工作目录,GOPATH 适合处理大量 Go 语言源码、多个包组合而成的复杂工程。
RiemannHypothesis
2022/09/28
5480
Golang中的包管理工具 - Go Modules
在Go1.5之前使用GOROOT和GOPATH这2个系统环境变量来决定包的位置,对于开发者主要使用GOPATH。GOPATH 解决了第三方源码依赖的问题,看一下我本机 $GOPATH/src 下的目录:
猿哥
2019/08/01
1.6K0
[Golang]包管理
本文是本人在探索 Go 最新的包管理 Go Modules 的一些总结,希望能够更深入了解 Go 最新的包管理方式,以及在实际环境中将它很好的使用起来。
别打名名
2020/07/28
1.8K0
相关推荐
迁移到 Go Modules
更多 >
交个朋友
加入腾讯云官网粉丝站
蹲全网底价单品 享第一手活动信息
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档