如何将包含多个文件的 Shiny 应用程序转换为易于共享和可重现的 Shiny 示例?
Posted
技术标签:
【中文标题】如何将包含多个文件的 Shiny 应用程序转换为易于共享和可重现的 Shiny 示例?【英文标题】:How to convert a Shiny app consisting of multiple files into an easily shareable and reproducible Shiny example? 【发布时间】:2018-06-28 19:28:36 【问题描述】:在 Stack Overflow 和 how to make a great R reproducible example 上有关于如何创建 Minimal, Complete, and Verifiable example 的资源。但是,shiny 问题没有类似的指导方针,而遵守某些标准则更有可能给出高质量的答案,从而解决您的问题。
但是,提出一个好的 Shiny 问题可能很困难。 shiny 应用程序通常又大又复杂,使用多个数据源,并且代码通常被拆分到多个文件中,因此很难与他人共享易于重现的代码。即使server.R
中可能出现问题,如果没有ui.R
的内容(可能还有其他文件,如样式表或global.R
),该示例也无法重现。单独复制粘贴所有这些文件的内容很麻烦,并且需要其他用户重新创建相同的文件结构才能重现问题。
所以;如何将您的 shiny 应用程序转换为可重现的良好示例?
【问题讨论】:
这对meta来说是一个更好的问题吗? 可能是,但我可能不是最好的判断者,因为我很少访问 meta。 help center 对 Stack Overflow 的“好”问题的定义相当广泛。我在这里问这个问题的原因主要是关于r
和 pandas 的类似问题也在 Stack Overflow 而不是元数据上,所以我认为这是正确的做法。
@Pac0 我明白你的意思——虽然我不确定我是否完全同意。也许将其从 cmets 转移到 discussion on Meta 是一个好主意,以获取其他人对这个问题和未来可能的类似问题的意见。
【参考方案1】:
示例数据
当然,在问题“how to make a great R reproducible example” 的答案中提到的所有关于样本数据的准则在创建与Shiny
相关的问题时也适用。总结一下:确保运行代码不需要额外的文件。使用mtcars
之类的示例数据集,或使用data.frame()
创建一些示例数据。如果您的数据非常复杂,并且确实需要这种复杂性来说明问题,您也可以使用dput()
。避免使用像read.csv()
这样的函数,当然除非你对像fileInput
这样的函数有疑问。
示例代码
始终将您的代码减少到最低限度,以重现您的错误或意外行为。这包括删除对其他.CSS
文件和.js
文件的调用,以及删除ui
和server
中不必要的函数。
闪亮的应用程序通常包含两个或三个文件(ui.R
、server.R
和可能的global.R
),例如this demo application。但是,最好将您的代码作为单个脚本发布,这样其他人就可以轻松地运行它,而无需手动创建这些文件。这可以通过以下方式轻松完成:
ui <- fluidPage(…)
包装你的用户界面,
server <- function(input,output, session) …
的服务器,
随后致电shinyApp(ui, server)
。
所以一个简单的骨架可以如下所示:
library(shiny)
ui <- fluidPage(
)
server <- function(input,output,session)
shinyApp(ui, server)
工作示例
因此,考虑到以上所有因素,Shiny 应用程序的一个良好的最小、完整和可验证示例如下所示:
library(shiny)
df <- data.frame(id = letters[1:10], value = seq(1,10))
ui <- fluidPage(
sliderInput('nrow', 'Number of rows', min = 1, max = 10, value = 5),
dataTableOutput('my_table')
)
server <- function(input, output, session)
output$my_table <- renderDataTable(
df[1:input$nrow,]
)
shinyApp(ui, server)
添加 CSS
有多种方法可以将自定义 CSS 添加到 Shiny 应用程序,如 here 所述。在可重现的示例中,将 CSS 添加到 Shiny 应用程序的首选方法是将 CSS 添加到代码中,而不是添加到单独的文件中。这可以通过在应用程序的ui
中添加一行来完成,例如如下:
tags$head(tags$style(html('body background-color: lightblue;'))),
【讨论】:
我认为函数shinyUI
已经过时且没有必要了。
@GyD,我认为你是对的,我相应地更新了答案。
@Florian。也许您可以解决应用程序何时需要加载文件。
@MLavoie,好建议,我希望通过“如果您的数据非常复杂并且确实需要复杂性来说明问题,您也可以使用 dput()。避免使用函数比如 read.csv()..." 你认为这涵盖了它,还是你在想别的东西?
是的,我认为可以。以上是关于如何将包含多个文件的 Shiny 应用程序转换为易于共享和可重现的 Shiny 示例?的主要内容,如果未能解决你的问题,请参考以下文章