闪亮的是一个r包,可以轻松地从R构建交互式Web应用程序(应用程序)。包装附带11个内置示例,每个示例都展示了有效的工作。这些示例中的每一个都是一个独立的应用程序。
的你好,闪亮的示例绘制R的直方图忠实的
数据集具有可配置数量的箱子。用户可以使用滑块栏更改箱数,该应用程序将立即响应其输入。你会使用你好,闪亮的探索闪亮应用程序的结构并创建您的第一个应用程序。
运行你好,闪亮的, 类型:
图书馆(闪亮)Runexample(“01_hello”)
闪亮的应用程序有两个组件:
用户界面(UI)脚本控制应用程序的布局和外观。它在命名的源文件中定义UI.R.
。以下是UI.R.
脚本为你好,闪亮的例子。
图书馆(闪亮)#定义绘制直方图shinyUI的应用程序的UI(FlultPage(#应用程序标题TitlePanel(“Hello Shiny!”),#侧栏具有滑块输入的Sidebarlayout的数量(Sidebanel(SliderInput(“垃圾箱”),“垃圾箱数:”,min = 1,max = 50,值= 30)),#显示生成的分布mainpanel(plotopput(“diftplot”)))))))))))
的服务器。R
脚本包含计算机需要构建应用程序的说明。这里是服务器。R
档案你好,闪亮的例子。
库(闪亮)#定义绘制直方图shinyserver所需的服务器逻辑(生成直方图的函数(输入,输出){#表达式。表达式为#inclated to erlayplot以指示:##)它是“反应性“因此,当输入改变#2时应自动#重新执行(x),max(x),length.out =输入$ bins + 1)#使用指定数量的bins hist(x,breaks = bins,col ='darkgray',border ='white')})})
在一个层面上你好,闪亮的服务器脚本非常简单。它确实有一些计算,然后用所请求的箱数绘制直方图。
但是,您还会注意到大多数脚本都被包裹在呼叫中renderPlot
。上面的评论函数解释了一下这个问题,但如果你发现它令人困惑,不要担心。我们很快就会覆盖这个概念。
玩你好,闪亮的应用程序并查看它的源代码。尝试培养一种对应用程序的工作方式。你的r会话将忙碌你好,闪亮的应用程序处于活动状态,因此您将无法运行任何R命令。R正在监视应用程序并执行应用程序的反应。要获取您的r会话,请点击转义或单击停止标志图标(在RStudio控制台面板的右上角)。
每个闪亮的应用程序都具有相同的结构:两个R脚本在目录中保存在一起。至少一个应用程序有UI.R.
和服务器。R
文件,并且您可以通过制作新目录并保存一个应用程序来创建应用程序UI.R.
和服务器。R
文件内部文件。每个闪亮的应用程序都需要自己的唯一目录。
您可以通过将其目录的名称提供给函数来运行闪亮的应用程序Runapp.
。例如,如果你的应用程序在一个名为my_app
,用以下代码运行它:
图书馆(闪亮)RunApp(“my_app”)
注意:的第一个参数Runapp.
是从工作目录到应用程序目录的文件路径。上面的代码假定应用程序目录位于您的工作目录中;在这种情况下,文件路径只是目录的名称。
如果你想知道,那么你好,闪亮的应用程序的文件存储在一个特殊的系统目录中,设计用于与runexample.
称呼。或者,您还可以通过调用来启动该应用程序
runapp(system.file(package =“shiny”,“示例”,“01_hello”))
创建名为的第一个闪亮的应用程序my_app
。为此,启动RStudio并从文件菜单选择新项目...>新目录>闪亮的Web应用程序。作为目录名称输入所需的名称my_app。该项目将开始UI.R.
和服务器。R
包含熟悉的代码你好,闪亮的应用程序。
要启动您的应用程序,请在R控制台中运行:
库(亮)runApp ()
或者,您可以单击运行应用程序按钮(在编辑器的顶部),或或使用键盘快捷方式:控制+ Shift + Enter
在Windows / Linux,或命令+ shift + Enter
在Mac上。
Rstudio将默认将在新窗口中启动应用程序,但您也可以选择在专用查看器窗格中或在外部Web浏览器中启动应用程序。单击旁边的图标进行选择运行应用程序。
对你的应用做一些改变:
“深灰色”
至“天蓝色”
。准备就绪后,再次启动您的应用程序。您的新应用应该匹配下面的图像。
既然你了解一个闪亮的应用程序的结构,现在是时候从头开始建立你的第一个应用程序了。我们将首先显示如何构建用户界面。您将学习如何布置用户界面并向其添加HTML元素。
我们将使用它my_app
你以前做过。要开始编辑服务器。R
和UI.R.
匹配以下脚本的文件:
UI.R.
ShinyUI(FluidPage())
服务器。R
ShinyServer(功能(输入,输出){})
这段代码是创建Shiny应用所需的最少代码。结果是一个带有空白用户界面的空白应用。
闪亮UI.R.
脚本使用函数流化物
创建一个自动调整到用户浏览器窗口尺寸的显示。控件中放置元素来布局应用程序流化物
函数。
例如,UI.R.
下面的脚本创建了一个用户界面,它有一个标题面板,然后是一个侧边栏布局,其中包括一个侧边栏面板和一个主面板。注意,这些元素被放置在流化物
函数。
#ui.r shinyui(sperepage(titlepanel(“标题面板”),侧栏(侧巴托尔(“侧边栏(”侧栏面板)“,MainPanel(”主面板“)))))))
TitlePanel.
和Sidebarlayout.
这两个最受欢迎的元素是什么流化物
。他们创建了一个带有侧边栏的基本闪亮应用程序。Sidebarlayout.
始终采取两个参数:
这些功能将内容放在侧栏或主面板中。
TitlePanel.
和Sidebarlayout.
为闪亮的应用程序创建一个基本布局,但您也可以创建更高级的设计。例如,navbarPage
创建包含导航栏的多页面用户界面。您还可以使用splitLayout
,或者你可以使用fluidRow
和列
构建基于网格的布局。有关概述,请参见闪亮的骗子。
你可以添加内容到你的Shiny应用程序中,把它放在一个*控制板
函数。例如,上面的应用程序在每个面板中显示一个字符串。单词“侧边栏面板”出现在侧边栏面板中,因为我们将字符串添加到侧巴班尔
功能,即sidebarPanel(“侧边栏面板”)
。标题面板和主面板中的文本也是如此。
要添加更高级的内容,可以使用Shiny的HTML标记函数之一。这些函数与常见的HTML5标记并行。作为一个例子,让我们尝试创建头文件。
创建一个头文件:
h1
或h3
)例如,你可以用“My title”创建一个第一级标题h1(“我的标题”)
。如果在R中运行此命令,则会注意到它会产生HTML代码。
h1(“我的标题”)
## 我的标题 h1>
要将该元素放在您的应用程序中,将其作为参数传递给TitlePanel.
,侧巴班尔
,或主帕尔
。文本将显示在您的网页的相应面板中。如果使用逗号分隔它们,则可以在同一面板中放置多个元素。
试试这个。下面的脚本使用了所有六个级别的标题。更新您的UI.R.
文件以匹配以下代码,然后重新启动您的应用程序。
#ui.r shinyui(sperepage(titlepanel(“我的闪亮应用程序”),侧栏(Sidebarpanel(),mainpanel(H1(“第一级标题”),H2(“第二级标题”),H3(“第三级标题”),H4(“第四级标题”),H5(“第五级标题”),H6(“第六级标题”))))))))))
现在你的应用看起来应该是这样的:
既然你知道如何创建用户界面的布局,现在是时候向您的应用添加一些控制小部件了。窗口小部件是用户可以与之交互的Web元素。小部件提供了从用户收集值并将其发送到您的应用的方法。当用户更改窗口小部件时,该值也会发生变化。
Shiny附带了一系列预构建的小部件,每个部件都使用名为R的透明函数创建。例如,功能sliderInput
创建滑动条。标准的Shiny小部件是:
功能 | 小部件 |
---|---|
actionButton |
行动按钮 |
checkboxGroupInput |
一组复选框 |
checkboxInput |
单个复选框 |
dateInput. |
帮助选择日期的日历 |
dateRangeInput |
用于选择日期范围的一对日历 |
fileInput. |
文件上传控件向导 |
隐形 |
帮助文本可以添加到输入表单中 |
numericInput |
输入数字的字段 |
radiobutons. |
一组单选按钮 |
SelectInput. |
有可供选择的选项的框 |
sliderInput |
滑块 |
submitButton. |
提交按钮 |
TextInput. |
输入文本的字段 |
其中一些窗口小部件是使用Twitter Bootstrap构建的,是一个用于构建用户界面的流行的开源框架。
您可以以相同的方式将窗口小部件添加到用户界面,以便通过放置窗口小部件函数来添加其他类型的HTML内容侧巴班尔
或主帕尔
在你的UI.R.
文件。
每个小部件函数需要几个参数。每个小部件的前两个参数都是
""
。剩余的参数因窗口小部件而异,这取决于窗口小部件需要做的工作。您可以在窗口小部件函数的帮助页面上找到小部件所需的确切参数,例如,?SelectInput.
。
下面的代码使应用程序如图所示。改变UI.R.
脚本my_app
来匹配它,然后重新启动应用程序。玩每个小部件,感受一下它的功能。尝试更改小部件函数的值并观察效果。
#ui.r shinyui(speterpage(titlepanel(“基本小部件”),fluistrow(列(3,h3(“按钮”),actbutton(“动作”,label =“action”),br(),br(),submitButton(“提交”)),列(3,H3(“单个复选框”),CheckBoxInput(“复选框”,标签=“选择A”,值= True)),列(3,CheckBoxGroupInput(“CheckGroup”,标签= H3(“复选框组”),选择=列表(“选择1”= 1,“选择2”= 2,“选择3”= 3),选择= 1),列(3,DateInput(“日期”),label = h3("Date input"), value = "2014-01-01")) ), fluidRow( column(3, dateRangeInput("dates", label = h3("Date range"))), column(3, fileInput("file", label = h3("File input"))), column(3, h3("Help text"), helpText("Note: help text isn't a true widget,", "but it provides an easy way to add text to", "accompany other widgets.")), column(3, numericInput("num", label = h3("Numeric input"), value = 1)) ), fluidRow( column(3, radioButtons("radio", label = h3("Radio buttons"), choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), selected = 1)), column(3, selectInput("select", label = h3("Select box"), choices = list("Choice 1" = 1, "Choice 2" = 2, "Choice 3" = 3), selected = 1)), column(3, sliderInput("slider1", label = h3("Sliders"), min = 0, max = 100, value = 50), sliderInput("slider2", "", min = 0, max = 100, value = c(25, 75)) ), column(3, textInput("text", label = h3("Text input"), value = "Enter text...")) ) ))
现在您将创建一个新的闪亮应用程序,创建一个交互式MA情节。该应用程序将允许您通过点击MA图选择一个基因,它将显示选定的基因计数图。
这个新的闪亮应用程序将需要它自己的新目录。关闭所有打开的项目,并创建一个名为ma_plot
在您的工作目录中。这是我们拯救的地方UI.R.
和服务器。R
下面描述的文件。
该应用程序将使用RNA-seq教程中的示例数据集。让我们从复制MA图开始。差分表达式调用的结果已经保存到数据文件中data.rda.
。将文件复制到新创建的文件夹ma_plot
,将您的工作目录更改为该文件夹,例如,使用setwd(“ma_plot”)
,并运行:
library(DESeq2) load("data.rda") res <- results(dds) ymax <- 5 plotMA(res, ylim=c(-ymax, ymax))
对于MA Plot出现在我们的闪亮应用程序中,我们需要:
UI.R.
。服务器。R
。Shiny提供了一系列将R对象转换为用户界面输出的函数。每个函数创建一个特定类型的输出:
输出功能 | 创造 |
---|---|
htmloutput. |
原始HTML |
imageOutput |
图像 |
plotOutput |
情节 |
TableDut. |
桌子 |
TextOutpul. |
文本 |
Uioutput. |
原始HTML |
您可以以与添加HTML元素和小部件的方式相同的方式将这些输出函数添加到用户界面。让我们使用plotOutput
将MA图添加到用户界面。
#ui.r size = 450 shinyui(spertpage(titlepanel(titlepanel(“ma plot explorer”),splitlayout(cellwidths = size,plotoutput(“plotma”,width = size,height = size)))))
注意plotOutput
以它的第一个参数提起字符串“plotma”
。每一个*输出
函数需要一个参数:闪亮将用作反应元素的名称的字符串。您的用户不会看到此名称,但您将稍后使用它。
我们已经使用过流化物
再一次,但这次我们使用splitLayout
将内容组织到宽度为细胞宽度
。我们将单元的宽度设置为绘图的宽度和高度,以相同的值大小
,我们已经设置为450像素。
将函数放入UI.R.
告诉Shiny在哪里显示你的对象。接下来,你需要告诉Shiny如何构建对象。
通过提供构建对象的R代码来做到这一点服务器。R
。代码应该进入出现内部的未命名功能shinyServer
在里面服务器。R
脚本。未命名的功能在闪亮的过程中起着特殊作用;它构建了一个名为的列表 - 类似的对象输出
每个R对象需要在列表中有自己的条目。
您可以通过定义新元素来创建一个条目输出
在未命名函数中,如下所示。元素名称应该与您创建的反应性元素的名称匹配UI.R.
。在下面的脚本中,输出$ plotma.
火柴PlotOutput(“plotma”,宽度=尺寸,高度=大小)
在你的UI.R.
脚本。
#服务器。Rlibrary(DESeq2) load("data.rda") res <- results(dds) ymax <- 5 shinyServer(function(input, output) { # MA-plot output$plotma <- renderPlot({ par( mar=c(5,5,3,2), cex.main=1.5, cex.lab=1.35 ) plotMA( res, ylim=c(-ymax, ymax) ) }) })
请注意,我们已将代码加载和预处理数据呼叫前的代码shinyServer
。呼吁票面价值
前plotma.
设置一些图形参数,提高了图的美学,如三月
设置页边距,或cex。*
增加相应元素的文本大小。有关详细信息,请参阅?不相上下
。
每个进入输出应包含闪亮的输出渲染*
职能。这些功能捕获了R表达,并在其上进行一些亮起预处理。使用渲染*
对应于您正在制作的反应物体类型的函数。
渲染功能 | 创造 |
---|---|
renderImage |
图像(保存为到源文件的链接) |
renderPlot |
情节 |
renderPrint |
任何打印输出 |
恒定 |
数据帧,矩阵,其他表等结构 |
renderText |
字符串 |
renderUI |
一个闪亮的标签对象或html |
每一个渲染*
函数采用单个参数:括号包围的R表达式,{}
。表达式可以包含许多行代码,就好像它是一个复杂的函数调用。把这个R表达式看作是你给Shiny的一组用来存储的指令。这些指令将在你第一次启动你的应用程序时运行,并且它们将在每次你的对象需要更新时重新运行。
要做到这一点,表达式应该返回您所想到的对象(一段文本、一个图、一个数据框架等)。如果表达式没有返回一个对象,或者返回了错误的对象类型,您将得到一个错误。
在此阶段,当您启动应用程序时,它将显示一个静态MA图。功能plotma.
有一个争论α
设置阈值调整后的p值的意义级别。我们现在将通过添加一个控制此参数的滑块窗口小部件来扩展应用程序。
首先,让我们在我们的绘图输出下方添加一个滑块小组件:
# ui。R大小= 450 shinyUI(fluidPage( titlePanel("MA plot explorer"), splitLayout(cellWidths=size, plotOutput("plotma", width=size, height=size) ), splitLayout(cellWidths=size, sliderInput("alpha", "Adjusted p-value treshold", min=0, max=0.2, value=0.1, step=0.001, width=size) ) ))
滑块允许在0.001的步长范围内选择0到0.2的值,并且我们已经设定了其宽度以匹配它上方的绘图大小。
您可以通过在构建绘图时闪亮调用滑块值来使绘图反应。让我们来看看如何做到这一点。
看一下第一行代码服务器。R
。您是否注意到未命名的职能提到两个参数,即输入
和输出
?你已经看到了输出
是一个类似列表的对象,用于存储在应用程序中构建R对象的指令。
输入
是第二个类似列表的对象。它存储了应用程序中所有小部件的当前值。这些值将被保存在小部件的名字下UI.R.
。
例如,我们的应用有一个小部件“α”
,其值将存储在输入$α
。如果一个物体使用了输入
价值。为了使MA Plot反应,替代您的服务器。R
脚本包含呼叫的行plotma.
以下是:
plotma(Res,Ylim = C(-ymax,Ymax),alpha =输入$ alpha)
当您准备好更新UI.R.
和服务器。R
文件,启动闪亮的应用程序。当您移动滑块时,绘图应立即重绘。
哪些输出依赖于哪些小部件。当用户更改一个小部件时,Shiny将使用该小部件的新值重新生成依赖于该小部件的所有输出。因此,重建的对象将完全是最新的。
这就是用Shiny创建反应性的方法,通过连接输入
对象输出
。闪亮照顾所有其他细节。
最后,我们将使MA Plot可点击允许选择一个基因,并为所选基因添加计数曲线。
我们首先将计数图添加到MA图旁边,这样UI.R.
脚本匹配以下内容:
#ui.r size = 450 shinyui(sperypage(titlepanel(“ma plot explorer”),splitlayout(cellwidths = size,plotoutput(“plotma”,click =“plotma_click”,width = size,height = size),plotoutput(“plotcounts“,width = size,height = size)),splitlayout(cellwidths = size,sliderinput(”alpha“,”调整后的p值三板“,min = 0,max = 0.2,值= 0.1,步骤= 0.001,宽度=尺寸)))))
注意额外的点击
对此的论点plotOutput
MA Plot的功能。如果设置为值plotma_click
,绘图将在单击它时向服务器发送坐标。这个值可以通过输入plotma_click美元
并将包含一个命名列表x
和y
指示鼠标位置的元素。我们将使用输入plotma_click美元
坐标以解决MA图中最近的基因。
让我们回到服务器。R
脚本。为了能够解决在MA图中哪个点最接近点击,我们创建t.data.scaled.
包含归一化坐标中的点的对象。我们将使用该对象在欧几里德距离方面找到最近的点。
#server.r库(deseq2)加载(“data.rda”)res < - 结果(dds)ymax < - 5#该对象将用于从单击事件中找到点。数据< - with(res,cbind(basemean,log2foldchange))数据[,2] < - pmin(ymax,pmax,data [,2]))比例< - c(diff(range(数据[,1])),2 * ymax)t.data.scaled < - t(数据)/比例shinyserver(函数(输入,输出){current = restiveValues(idx = null)观察({xy = c(输入$ plotma_click $ x,输入$ plotma_click $ y)如果(!is.null(xy)){##找到最近点Sqdists的索引< - colmeans((t.data.scaled - xy / scale)^ 2)当前$ idx < -其中.MIN(SQDISTS)}})#ma-plot输出$ plotma < - renderplot({par(mar = c(5,5,5,3,2),cex.main = 1.5,cex.lab = 1.35)plotma(res,ylim = c(-ymax,ymax),alpha =输入$ alpha)#在所选点id id id id and endx = current $ idx附近(!是null(idx))点(数据[idx,1],数据[idx,2],col =“dodgerblue”,cex = 3,lwd = 3)})#Selated Gene输出$ PlotCounts < - 叶果({PAR(Mar = C(5,5,3,2),cex.main=1.5, cex.lab=1.35 ) # update only when idx changes idx = current$idx if (!is.null(idx)) plotCounts( dds, idx, intgroup=c("dex") ) }) })
除了更新renderPlot
负责绘图的功能,我们闪亮的应用程序还有一些其他重要的补充。即,我们使用过reactiveValues
对象和一个观察者
简化应用程序。
无响应值包含可以随时间变化的值,其他无响应对象可以读取这些值。特别是,输入
对象是A.reactiveValues
对象,它看起来类似于一个列表,并包含许多单独的响应值。
当您从中读取值reactiveValues
对象,调用响应式表达式接受对该值的响应式依赖,当您向其写入时,它会通知依赖于该值的任何响应式函数。
我们使用反应价值当前$ IDX.
用于存储当前突出显示的基因的索引。它的值设置在观察者
下面描述,两个图都依赖于它。
观察者可以读取响应值,例如小部件输入。当原始小部件发生变化时,观察者将更新其值。观察者不返回任何值,因此只对它们的副作用有用。
上面的观察者是用来更新当前$ IDX.
有价值的时候才有价值C(输入$ plotma_click $ x,输入$ plotma_click $ y)
对非空值的更改,该值对应于单击绘图的用户。
如果你点击MA图会发生什么?
这将使两个图绘制renderPlot
过时,即使他们不直接依赖输入plotma_click美元
。Shiny将知道它们已经过时,并将重新绘制绘图,因为它将跟踪输出对象所依赖的响应值。Shiny将自动重建一个对象,如果在对象的反应/输入值渲染*
功能变化。
有许多包提供高级功能,可以增强你的Shiny应用程序。这些包括: