整理之前在知识星球打卡汇总的 Shiny 笔记,作为速学、速查使用和分享。
基于 https://shiny.rstudio.com/tutorial/ 视频而非文字教程写的笔记。
UI 主要目的是创建展示界面。Server 主要目的是创建和管理服务逻辑。
Inputs 是与用户交互的组件,用户获取用户输入。Outputs 是 Shiny 通过响应用户输入而在指定区域展示的输出,一般为图表。每个输入组件都有唯一标识符,需要展示的标签名作为参数,其他一些参数则应不同组件提供的不同功能而不同。每个输出组件也有它的唯一标识符。当在 UI 插入一个输出组件后,会自动分配一块空间用于展示,但展示的生成和逻辑都在服务端完成。
server:集成输入生成输出。3 个步骤要点:
output$hist
。render*
函数生成要展示的元素。input$xx
使用来自 UI 的输入。将所有脚本和材料保存到一个目录,目录下代码通常以以下 2 种方式之一存储:
一个 RStudio 公司开发的用来部署 Shiny 的网站,URL shinyapps.io。每个人每个月有一定的免费额度。
Shiny server: 在自己的 linux 服务器上管理和部署 shiny 的软件 Download Shiny Server - RStudio更多 shiny 内容:Shiny最后就是复习,第一部分总的下来是非常简单的,主要是了解整个 shiny 怎么工作的,大体有哪些组件。
响应式编程:当输入改变时,输出根据逻辑会自动进行所需要的运算,对结果值更新。值得注意的是,虽然我们在编写 Shiny 程序时还是按照顺序的流程编写,但实际上不同的表达式对于 Shiny 本身而言是没有顺序的。
响应值就是 Shiny 中的数据流,input 是响应值的列表,这些值展示了当前输入的各自状态。注意⚠️:响应值只能在对应的设定好的响应环境中使用!
render*
函数构建 shiny app 中要显示的对象。output
对应的元素中。render*
函数创建一个 observer 对象,它关联了生成上述结果的代码块。需要注意⚠️的是,当多个输入在同一个代码块中时,修改一个参数会更新全部的参数,在一般情况下没有问题,但如果涉及随机数就会影响整个结果。例如讲解视频中的例子,当修改图标题时,代码重新运行,而数据来自随机函数,随机函数被重新执行,最终效果是不仅仅图标题改变了,生成的数据也发生了改变。
(这里如果修改 title,整个结果都会发生改变)
回顾上一部分的学习中,当多处使用同一随机数据时,不同地方的数据将变得不一致。为了解决这个问题,也为了解决代码重复,Shiny 里提出了响应表达式,其构造函数为 reactive()
。当表达式被传入该函数中,将生成响应表达式, 有趣的是,当使用一个响应表达式时,我们需要在其符号后加括号,像函数一样对待它。例如, data <- reactive({xxx})
,后续使用 data()
使用它。
如何在不更新图的情况下更新标题呢?这就需要使用 isolate() 了。
(注意这里虽然图更新了,但绘图数据并没有更新)
有时候我们需要做一些按按钮才进行分析或者绘图的触发操作,在前端我们可以使用 actionButton,在服务端我们需要使用 observeEvent()
触发相应的工作代码。除了 observeEvent()
, observe
也可以用来进行触发,它更加底层,只需要输入一个表达式,表达式内部的响应值都将被监测,当有任何值改变时,整个表达式将重新执行。
除了直接使用 observeEvent()
响应按键的更新,我们还可以使用 eventReactive()
依据按键创建一个响应值,然后复用这个响应值对结果进行更新。
input
是无法修改的,我们可以通过 reactiveValues()
来生成一个列表,管理响应值的状态,包括修改。
即如何减少重复代码,模块化。
可以阅读文章 https://shiny.rstudio.com/articles/understanding-reactivity.html 理解响应式编程。
HTML 构建了 Shiny 的展示界面,所有的 Shiny 前端函数结果其实都被转换为 HTML。
通过 shiny 提供的 tags$
函数添加 HTML 元素。命名参数表示 HTML 元素属性,非命名参数表示元素内容。列表见:https://shiny.rstudio.com/articles/tag-glossary.ht...另外, HTML()
可以包裹原生的 HTML 文本。如果需要在本地存放资源,如图片,需要放置到 www 目录下。
通过将页面划分为网格状,从而控制布局。
fluidRow()
创建行。column()
创建列。每个新增的列都会对齐到左侧的列。页面总宽度为12,offset 可以设置偏移量。如果要在网格布局中添加元素,只需要将元素当作参数传入即可。
仪表板,即 panel,将多个 HTML 元素组装为带有属性的独立单元。
相关指南:Shiny - Application layout guide
sidebarLayout()
: 带侧边栏的布局。fixedPage()
: 创建固定宽高的页面。navbarPage()
: 带多个标签页的页面布局。navbarMenu()
: 创建多个标签页的下拉栏。shinydashboard
包提供的 dashboardPage()
提供了仪表盘页面 Shiny Dashboard。CSS,即层叠样式表提供了自定义网页中元素布局的框架。
Shiny 使用的是 Bootstrap 3 CSS 框架。
css
文件应当放在 www 目录下,然后放到 header 部分进行链接。tags$style()
和 HTML()
手动写 CSS;或使用 includeCSS()
。完结拉!!!