查看原文
其他

shiny 入门第一课

JunJunLab 老俊俊的生信笔记 2022-08-15


守善独身

1引言

shiny 是一个 R 包,能够将代码自动“反应式”绑定输入和输出,以及大量预先构建的小部件来 构建交互式 web 应用程序变得异常简单 ,这就可以构建漂亮、响应迅速、功能强大的应用程序。

说白了你可以利用它写一个 具有功能的 web 网页 ,基于的代码就是 R code,你可以看到很多 数据库, 在线单细胞可视化分析, RNA-seq 在线分析网址 等都是基于 shiny 构建的,当然你也可以构建一个属于你自己的小应用,方便自己的的数据分析或者可视化

生信技能树的 B 站上 有一期完整的 shiny 教程,也推荐大家去学习观看:

大家也可以读读 电子版的 mastering-shiny 书:

网址: https://mastering-shiny.org/

我们还是从基础开始,学习一些最基本的东西,后面慢慢深入了解。

2安装

安装 shiny:

install.packages("shiny")
library(shiny)

3构建第一个 shiny 应用

打开 Rstudio,左上角 file 点击 new file 然后 shiny web App 即可新建一个 shiny 应用:

然后 添加名称,选择 一个文件 还是 多个文件 ,代码短可以一个文件里:

然后得到一个 app.R 的脚本文件,我们点击右上角的 Run App 即可运行:

这个默认的 APP 是一个 绘制直方图 的小脚本,提供 选择不同的 bin 数量达到不同分辨率的直方图:

4代码结构

一个完整的 App 的大概可以分为以下 3 个部分:

  • 1.ui 部分: 也就是我们页面端我们眼睛能够看到的部分,比如控件,文字,图形等。
  • 2.server 部分: 这部分是主要的代码部分,通过连接 ui 部分的输入,然后通过 server 的代码执行来反馈到 ui 上面。
  • 3.运行 APP 的代码: 这部分在代码结尾,来运行 ui 和 server 的代码。

5ui 部分

下面我们来看看这个应用的 ui 部分:

# Define UI for application that draws a histogram
ui <- fluidPage(

    # 应用标题
    titlePanel("Old Faithful Geyser Data"),

    # 边界栏布局
    sidebarLayout(
        # 边界栏
        sidebarPanel(
            # 滑动控件
            sliderInput("bins",
                        "Number of bins:",
                        min = 1,
                        max = 50,
                        value = 30)
        ),

        # 主显示栏
        mainPanel(
           # 绘图
           plotOutput("distPlot")
        )
    )
)

fluidPage 函数主要分为 标题布局 两部分,布局又分为 左边显示栏(较窄)右边主显示栏(较宽),你也可以放在右边:

sidebarLayout(position = "right",

  sidebarPanel(
    # Inputs excluded for brevity
  ),
  mainPanel(
    # Outputs excluded for brevity
  )
)

shiny 还有多种布局:

grid 布局:

fluidRow() 格式的可以分成几行几列:

tabsetPanel 布局:

tabsetPanel() 格式的具有多个页面的布局:

Navlists 布局:

navlistPanel() 格式的左边导航布局:

Navbar Pages 布局:

navbarPage() 格式的上方多界面布局,可支持子页面选项:

布局里的输入控件

基于在布局里,我们可以 添加各种各样的小控件 来控制图形或者其它的显示或输出,下面是一个输入控件的基本组成:

每个控件都会有 inputIdlabel, inputId 是控件的 隐形属性,具有 唯一性, 不能重复, label 是控件的显示名称,是 直接显示在 ui 里面 的,上图可以看到这个滑动控件的名称为 Choose a number, 然后每个控件具有其它的自己不一样的参数。

以下是 shiny输入控件:

代码: https://shiny.rstudio.com/tutorial/written-tutorial/lesson3/

布局里的输出函数

除了输入控件,为了 响应输入控件的变化 ,还可以添加 输出函数 来展现输入产生的影响或者结果,比如 图形, 文字, 下载图片或文件 等等。

下面是一个输出函数的基本组成:

只需要一个输出的 outputId 即可,也是隐性看不见的,这个 Id 用来传输给 server 的代码部分

有以下几种输出:

可以输出 表格, 图片, 图形, 文字, 代码 等等。

6server 部分

有了 ui 里的输入与输出部分,看起来它们是没有任何联系的,server 部分就是来 连接这两个部分,从而构建一个完整的反应流程的。

server 的格式为:

server <- function(input, output) {
    ...
}

里面就是具体的分析 code 部分。

# Define server logic required to draw a histogram
server <- function(input, output) {

    output$distPlot <- renderPlot({
        # 接收输入控件的变量 input$bins from ui.R
        x    <- faithful[, 2]
        bins <- seq(min(x), max(x), length.out = input$bins + 1)

        # 绘制直方图
        hist(x, breaks = bins, col = 'darkgray', border = 'white')
    })
}

由以上代码解析看到,连接的基本格式为:

output$distPlot <- renderPlot({
        ...
    })

使用 output$ 输出 Id 名称renderPlot 来产出绘图结果,我们需要输出什么就使用对于的 render* 函数即可:

接收 ui 的输入变量则使用 input$ 输入控件 Id 名称 即可:

length.out = input$bins + 1

7连接 ui 和 server 代码

最后一部分代码很简单:

# Run the application
shinyApp(ui = ui, server = server)

这样就可以一起运行 uiserver 部分的代码了。

8HTML 内容

我们还可以在 ui 里面添加 html 属性的元素:

ui <- fluidPage(
  titlePanel("My Shiny App"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel(
      h1("First level title"),
      h2("Second level title"),
      h3("Third level title"),
      h4("Fourth level title"),
      h5("Fifth level title"),
      h6("Sixth level title")
    )
  )
)

居中显示, align = "center":

ui <- fluidPage(
  titlePanel("My Star Wars App"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel(
      h6("Episode IV", align = "center"),
      h6("A NEW HOPE", align = "center"),
      h5("It is a period of civil war.", align = "center"),
      h4("Rebel spaceships, striking", align = "center"),
      h3("from a hidden base, have won", align = "center"),
      h2("their first victory against the", align = "center"),
      h1("evil Galactic Empire.")
    )
  )
)

格式化文本显示:

ui <- fluidPage(
  titlePanel("My Shiny App"),
  sidebarLayout(
    sidebarPanel(),
    mainPanel(
      # 段落
      p("p creates a paragraph of text."),
      p("A new p() command starts a new paragraph. Supply a style attribute to change the format of the entire paragraph.", style = "font-family: 'times'; font-si16pt"),
      # 加粗
      strong("strong() makes bold text."),
      # 斜体
      em("em() creates italicized (i.e, emphasized) text."),
      # 空行
      br(),
      # 代码
      code("code displays your text similar to computer code"),
      div("div creates segments of text with a similar style. This division of text is all blue because I passed the argument 'style = color:blue' to div", style = "color:blue"),
      br(),
      p("span does the same thing as div, but it works with",
        span("groups of words", style = "color:blue"),
        "that appear inside a paragraph.")
    )
  )
)

9宁静

喧嚣的城市与急促的生活促使我们向往宁静和自由的生活。



欢迎加入生信交流群。加我微信我也拉你进 微信群聊 老俊俊生信交流群 哦,。

群二维码:

老俊俊微信:


知识星球:



所以今天你学习了吗?

欢迎小伙伴留言评论!

今天的分享就到这里了,敬请期待下一篇!

最后欢迎大家分享转发,您的点赞是对我的鼓励肯定

如果觉得对您帮助很大,赏杯快乐水喝喝吧!



 往期回顾 




DESeq2 归一化原理解析

绘制 m6A peak 在 lncRNA 上的分布

snakemake 使用多环境分析数据

跟着 Genome Research 学画图: 等高线散点图

基因 hclust 聚类并绘制聚类热图和表达趋势图

设置 wsl 子系统的使用线程和内存

使用 Mfuzz 包聚类分析并自定义绘图

clusterProfiler 的 shiny 版上线了!

听说你想把 spearman 和 pearson 展示在一张相关性热图里?

snakemake 进阶用法

◀...

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存