如何将包含多个文件的 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 文件的调用,以及删除uiserver 中不必要的函数。

闪亮的应用程序通常包含两个或三个文件(ui.Rserver.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 示例?的主要内容,如果未能解决你的问题,请参考以下文章

如何从 R/Shiny 应用程序下载多个文件?

有效调试闪亮的应用程序

如何使用具有多个输出的 R Shiny moduleServer

如何在 R Shiny 中仅使用一个下载按钮下载多个图?

在 Shiny 中保存多个 TinyMCE 的内容

如何将字符串输入(带空格的数字)转换为Shiny(R)中的数据帧?