掌握Python的Shiny:构建交互式Web应用的入门指南

Shiny简介及其优势

有经验的R语言用户可能听说过Shiny包,它允许您创建交互式Web应用程序。R Shiny于2012年发布,随着人们意识到这个易于使用的包可以让科学家和分析师创建更多交互式模型和仪表板,需求迅速增长。

在2023年,Python的Shiny版本推出了alpha版,为Python语言提供了一个类似的响应式框架。Shiny以其简单性和高效性而闻名,可以创建基于Web的仪表板和应用程序,无需繁琐的Web开发技能。

什么是Shiny?

Shiny是一个开源的用于R和Python的Web应用程序框架。它使数据专业人员能够将他们的分析转化为交互式的Web应用程序。Shiny的核心围绕着响应式编程的概念,即输入的变化(如滑块或按钮)会自动触发输出的更新(如图表或表格)。

使用Shiny框架创建基于Web的应用程序有许多好处。Shiny利用响应式编程,允许您构建对用户输入动态响应的应用程序,从而创建更具吸引力和个性化的体验。Shiny具有用户友好的库和全面的文档,使那些具有基本编程知识的人能够创建交互式和视觉上吸引人的应用程序。对于Python爱好者来说,Shiny现在提供了一个桥梁,将Python丰富的数据科学生态系统与Shiny的Web开发能力相结合。

以下是一些Shiny框架会有价值的示例:

  • 交互式仪表盘:Shiny非常适合构建交互式仪表盘,允许用户实时探索和可视化数据。您可以使用这些提示来设计出色的仪表盘
  • 数据探索:分析师可以使用Shiny创建应用程序,使用户能够交互式地探索数据集,即时调整参数和可视化。
  • 决策支持系统:Shiny可用于开发决策支持系统,通过提供动态洞察力促进基于数据的决策。
  • 教育工具:Shiny在教育环境中非常有价值,允许创建交互式教学材料和演示。

注意:重要的是要理解Shiny for R和Shiny for Python是不同的。虽然它们具有类似的基本概念,但语法和术语不能互换。如果您知道如何使用Shiny for R,那么学习Shiny for Python会更容易,但您仍然需要学习为适应Python而引入的差异。

Shiny与其他Web应用程序框架的比较

在考虑用于数据科学的Web应用程序开发时,了解Shiny与其他框架的比较是很有用的。

Shiny提供了简单和多功能的独特组合。然而,与其他框架相比,Python版本相对较新。Shiny旨在使开发Web应用程序对任何具有Python编码知识的人都可访问。

除了易用性外,它还被设计成可以无缝扩展,利用缓存和选择性反应性来保持其反应式框架的高效性。这使它比其他一些网页设计框架具有优势。它的声明式语法和反应式编程模型也使数据分析师能够创建交互式应用程序,而无需广泛的网页开发专业知识。

相比之下,像Dash和Streamlit这样的其他框架提供了不同的优势。Dash使用Pythonic语法并强调快速开发。Streamlit在快速原型设计方面表现出色,具有自动渲染的功能,但当输入发生变化时,会重新运行整个程序,导致应用程序在规模扩大时效率低下。Flask和Django是通用的Web框架,提供了灵活性和控制性,但通常需要更多的Web开发专业知识。如果您有兴趣学习这些内容,可以阅读DataCamp的Django教程

除了基于代码的网页开发平台外,数据分析师还使用Tableau和Power BI进行类似的仪表盘创建。这些是数据可视化平台,提供强大的工具,但需要付费许可。与纯代码相比,这些程序的分析功能也有限,并且需要在其他地方完成大部分复杂建模和分析。您可以在DataCamp上了解更多关于Power BI的信息。在选择适合特定数据科学应用的最合适的框架时,考虑项目要求、语言偏好和对特定功能的需求是至关重要的。虽然其他框架都有自己的优势,但Shiny独特的简单性和灵活性,再加上它与Python的集成,使其成为任何渴望提升数据科学项目的人的一个引人注目的选择。

框架

主要特点

语言支持

学习曲线

使用案例

Shiny

‘简洁和多功能

R,Python

交互式应用程序和可视化

Dash

Pythonic语法

Python

适度

快速开发轻量级Web应用程序

Streamlit

使用自动渲染进行快速原型设计

Python

快速原型制作数据应用程序

Flask

通用的网络框架

Python

中等到高

全方位的网络应用

Django

高级Python Web框架

Python

中等到高

可扩展的网络应用和服务

Tableau/Power BI

数据可视化平台

不适用

商业智能可视化

设置开发环境

Shiny for Python的一个很棒的特点是有一个网络编辑器,您可以在其中创建应用程序而无需下载或安装任何东西。 这个网络编辑器提供了几个应用程序和功能的示例,您可以使用它们来开始并尝试您的新Shiny应用程序。

然而,在您的开发过程中,可能会有一个时刻,您希望在本地设备上运行Shiny。本节将指导您安装Python、Shiny及其各自的依赖项,以及必要的配置,使您的本地环境能够顺利运行。

安装Python

要开始离线使用Shiny,您需要在计算机上安装Python。如果您尚未安装Python,请访问官方Python网站 python.org并下载适用于您操作系统的最新版本的Python。如果您以前已安装Python,我建议更新到最新版本以确保Shiny正常运行。

运行下载的安装程序,并在安装过程中勾选“将Python添加到PATH”选项。这样可以更方便地从命令行中运行Python。打开命令提示符或终端,输入python –version来验证Python是否已成功安装。您应该能看到显示的版本号。您也可以选择安装一个集成开发环境(IDE)以方便使用。

安装Shiny

一旦Python设置完成,您可以安装Shiny。只要您拥有最新版本的Python,您应该能够打开命令提示符或终端,并使用以下命令使用pip安装Python的Shiny库:

pip install shiny

如果你使用conda而不是pip,请使用以下命令:

conda install -c conda-forge shiny

根据您的系统配置,Shiny可能有额外的依赖项。请按照Shiny文档中提供的说明安装这些依赖项。

配置开发环境

现在您已经安装了Python和Shiny,还有三个主题需要处理。

  1. IDE: 如果你正在使用一个集成开发环境(IDE),比如VS Code,那么你可以选择安装一个扩展来让Shiny的输出在IDE中渲染。
  2. 版本控制:考虑使用像Git这样的版本控制系统来跟踪代码的变化。在项目文件夹中初始化一个Git仓库,以便轻松管理和协作开发你的Shiny应用程序。
  3. 代码结构:组织你的项目结构。为你的Shiny应用程序、数据集和其他资源创建单独的文件夹。这有助于保持代码库的整洁和有序,这是任何编码项目的最佳实践

现在,你已经设置和配置好了开发环境,可以开始使用Shiny for Python构建交互式Web应用程序了。

创建一个基本的Shiny应用

理解Shiny应用的结构

Shiny应用由两个主要组件组成:用户界面(UI)和服务器逻辑。

用户界面(UI)定义了应用程序的外观以及用户可以进行交互的元素。用户可以看到或与之交互的任何内容都是UI的一部分,包括滑块、按钮和图表等元素。

UI是使用以“ui.”开头的函数创建的,例如ui.input_numeric、ui.input_slider和ui.output_text。这些函数被包装在一个页面函数中,通常是ui.page_fluid,描述页面的基本布局。

服务器逻辑定义了应用程序的行为和对用户输入的响应。它由从用户界面获取输入、处理它们并相应地更新输出元素的函数组成。服务器逻辑是使用服务器函数创建的,并包括处理输入和输出的反应表达式。

在定义了用户界面和服务器逻辑之后,我们将它们连接在一起形成一个完整的应用程序,该应用程序必须命名为“app”。

image3.png

这段文字的中文翻译如下:

理解响应式编程模型

考虑一下来自Shiny文档的这个例子。

这个例子从滑块中获取用户输入,并使用它进行计算,计算结果显示在滑块下方的文本框中。这个非常简单的例子在VS Code中的本地主机上运行的简单浏览器中。

这段文字的中文翻译如下:

从这个简单的演示中可以看出,Shiny的魔力在于其互动性。Shiny互动性的引擎在于其反应式编程模型。在Shiny中,我们定义反应式表达式来创建输入和输出之间的依赖链。当输入发生变化时,所有依赖的反应式表达式和输出都会自动更新。这种反应性是Shiny的核心。您可以在这里阅读更多关于Shiny反应性的详细信息

有几个关键要素使得这种反应性成为可能。

首先,是反应式计算,或者叫做reactive.Calc。这是一种基于输入的计算。这个计算会缓存它返回的值,直到输入发生变化时,它会使用新的输入重新运行。这样可以使你的应用对用户输入做出高效的响应。反应式计算使用装饰器@reactive.Calc,如下面的示例所示。

@reactive.Calc
def double_number():
	return input.number() * 2

另一个响应式元素是响应式效果,或者reactive.Effect。当响应式效果运行时,它不返回任何值。相反,它会触发一个效果,比如修改一个变量或保存一个文件。它还会在输入发生变化时重新运行。最常见的响应式效果是@output装饰器,它将结果字符串添加到消息队列中,就像下面的示例中一样。

@output
@render.text
def txt():
	return f"x的值为{input.x()}"

有时候,你可能不希望你的应用程序的反应性太即时。例如,如果你有一个计算成本高昂的模型,你可能希望在多个参数更新之前等待,然后再重新运行模型。在这种情况下,reactive.event()或者使用reactive.isolate()提供了限制应用程序反应性的选项。

为您的Shiny应用程序添加交互性

当您需要一个更复杂的应用程序时

通过这种反应逻辑,Shiny for Python可以根据您的需要创建复杂或简单的应用程序。您可以添加单选按钮、复选框、滑块、文本输入框、图表、地图等等!以下是来自Shiny文档的一个稍微复杂一些的示例。

在这个例子中,我们创建了一张随机数据的热力图。用户可以选择热力图的样式,而滑块函数则可以改变热力图上颜色的范围。Posit(创建Shiny的公司)在他们的网站上提供了更多的例子,包括这个有趣的Wordle克隆

虽然这种互动性很有趣,但也有许多有用的应用。您可以设计一个模型,将环境因素(如盐度和温度)纳入考虑,并利用它们来预测藻类水华。领域内的研究人员可以将当前值输入到您的Shiny应用程序中,它将向研究人员提供实时预测。

如果满足某些条件,您可以设计一个模型来显示年度收益预测。然后,经理们可以使用您的应用程序通过输入不同的销售数量或勾选他们提供的产品的复选框来尝试不同的情景,他们将看到预测结果在他们眼前更新。

在多个行业中,使用案例非常多。

输入和输出的类型

Shiny提供了各种输入和输出选项,以满足不同的数据可视化和交互需求。下面是一个简单的表格,列出了Shiny for Python中常见的输入和输出选项。

输入

它是做什么的?

动作按钮输入

为用户提供一个选择按钮。

动作链接输入

允许用户点击链接。

文本输入

提供一个简单文本框,用于输入一行文本。

数字输入

提供一个带有上下箭头的数字输入框。

滑块输入

创建一个数字滑块。

 

复选框输入

生成一个用于True/False应用的单个复选框。

切换输入

生成一个单个的开/关开关。

 

复选框组输入

创建多个复选框以供多项选择。

选择输入

提供一个选择的下拉菜单。

单选按钮输入

创建单选按钮选项,强制只能选择一个选项。

文本区输入

提供一个更大的文本框,可调整大小的窗口,用于输入更长的文本。

日期输入

创建一个带有日历的日期输入框,供用户选择日期。

日期范围输入

基本上是两个配对的日期输入框,允许输入一个范围。

密码输入

创建一个隐藏输入文本的文本框。

———————————————————————————————————————————

输出

它是做什么的?

文本输出

以纯HTML格式编写文本。

逐字文本输出

在等宽代码块中编写文本。

UI输出

根据用户输入,允许更动态的用户界面。

绘制输出

使用常见的Python库(如matplotlib)生成图表。

表格输出

创建一个带有列标题的普通表格。

数据框架/网格输出

创建一个可自定义的带有过滤器、网格线和行限制的表格。

要获取完整的Shiny组件列表,请查看此页面

自定义Shiny For Python的用户界面

布局和主题

Shiny通过使用页面函数提供了灵活性,可以通过各种布局来自定义用户界面。最常用的页面函数是page_fluid(),它提供了一个响应式设计,可以适应不同的屏幕尺寸。使用page_fixed()页面函数可以实现适用于具有特定设计要求的应用程序的固定宽度布局。

Shiny利用HTML来创建其基于Web的应用程序。这意味着您可以使用CSS主题来为您的应用程序添加样式。添加自定义的CSS样式可以使您能够根据您的审美偏好或公司品牌来定制Shiny应用程序的外观。

自定义小部件和扩展的实现

Shiny支持ipywidgets用于各种交互式图表、地图、3D可视化和媒体流。它还具有一些功能,可以将其他Python小部件保存为HTML文件。通过添加自定义小部件,您可以根据特定的用例定制您的Shiny应用程序,并创建更加个性化的用户体验。

部署你的Shiny For Python应用

不同部署选项的解释

一旦你创建了一个引人注目的Shiny应用,你可能想要与更广泛的受众分享,无论是为了你的作品集还是为了客户,通过将其部署到网络上。Shiny支持各种部署选项,以满足不同的需求。

本地部署:您可以将您的Shiny应用部署在本地服务器上,使其在您的组织内或特定用户组中可访问。

基于云的平台:云平台提供了可扩展和易于访问的部署Shiny应用的解决方案。流行的选择包括:

  • Shinyapps.io:Posit自己的平台,专门用于托管Shiny应用程序。
  • Heroku:一种支持Shiny应用程序部署的云平台。
  • AWS、Azure和Google Cloud:主要的云服务提供商,允许您在虚拟机或容器上部署Shiny应用程序。

ShinyLive:Shiny提供了一种新的方式,在Web浏览器中运行Shiny应用程序,而无需单独运行Python的服务器。它结合了Web Assembly和pyodide,允许Shiny应用程序在计算机上无需安装Python或Shiny的情况下运行。该平台限制了可用的Python包,并且可能不像其他平台那样安全,但它是快速共享非敏感代码的好方法。

结论

Shiny for Python是网络应用程序开发领域的一位令人兴奋的新成员。使用它可以显著提升您的数据项目,而无需花费大量时间学习网络开发。如果您有兴趣尝试Shiny for R,请查看DataCamp的Shiny基础课程关于使用R Shiny创建仪表板的课程。一旦掌握了基础知识,可以通过Shiny案例研究来练习您的新技能!

抱歉,我无法翻译视频和图片标签,也无法保留代码块。以下是我对文本的翻译:

“你是一个翻译员。”