测试模块化R闪亮(傀儡)仪表盘

测试模块化R闪亮(傀儡)仪表盘,r,shiny,golem,R,Shiny,Golem,我一直在探索(**并热爱)golem软件包,该软件包用于开发带有R Shining的模块化仪表板。但我正努力思考如何测试模块化仪表板 例如,在下面的repex中,如果导入模块中的输入$n_行设置为15,我将如何测试显示模块中的输出是否包含15行 我非常感谢大家对我的支持 library(shiny) library(reactable) library(dplyr) # Import module UI mod_import_ui <- function(id){ ns &l

我一直在探索(**并热爱)golem软件包,该软件包用于开发带有R Shining的模块化仪表板。但我正努力思考如何测试模块化仪表板

例如,在下面的repex中,如果导入模块中的输入$n_行设置为15,我将如何测试显示模块中的输出是否包含15行

我非常感谢大家对我的支持


library(shiny)
library(reactable)
library(dplyr)

# Import module UI
mod_import_ui <- function(id){
  
  ns <- NS(id)
  
  fluidRow(
    # Allow the user to select the number of rows to view
    numericInput(ns("n_rows"), 
                 "Select number of observations",
                 value = 10)
    
  )
}

# Import module Server
mod_import_server <- function(id){
  
  moduleServer(
    id,
    function(input, output, session){
      
      data <- reactive({
        
        # Sample the requested number of rows from mtcars and return this to the application server
        mtcars %>%
          slice_sample(n = input$n_rows)
        # [....] # Some complex formatting and transformations
        
      })
      
      return(data)
      
      
      
    }
  )}

# Display module UI
mod_display_ui <- function(id){
  
  ns <- NS(id)
  
  fluidRow(
    
    reactableOutput(ns("table"))
    
  )
}

# Display module Server
mod_display_server <- function(id, data_in){
  
  moduleServer(
    id,
    function(input, output, session){
      
      # [....] # Some more transformations and merging with data from other modules
      
      output$table <- renderReactable(reactable(data_in()))
      
    }
  )}


app_ui <- function(request) { 
  
  tagList(
  
    mod_import_ui("import_1"),
    mod_display_ui("display_1")

  )
  
  }


app_server <- function(input, output, session) { 
  
  data_in <- mod_import_server("import_1")
  mod_display_server("display_1", data_in)
  
}

shinyApp(ui = app_ui, server = app_server)



图书馆(闪亮)
库(可反应)
图书馆(dplyr)
#导入模块用户界面

mod_import_ui我建议将应用程序的核心与用户界面分离

{golem}框架允许在R包中构建应用程序,这意味着您可以使用从包构建到记录和测试代码的所有工具。
如果您按照中的指南进行操作,您将看到我们建议您从“服务器”部分提取所有R代码,以在小插曲中对其进行测试,并将其转换为常规函数,以便您可以像往常一样使用R软件包对其进行测试。
因此,ShinyApp只调用已经记录和测试过的内部函数。使用这种方法,您可以测试应用程序中可能发生的不同场景的输出。在静态脚本中尝试不同的输入参数,并验证输出,无论您在开发的下一步在应用程序中做了什么更改

这本书提供了许多建议。如果我必须将其总结为一个工作流,这将是:

  • 直接在Rmd中构建必要的代码。这允许您测试操作,而无需执行所有必要的单击操作。我们称之为“Rmd优先”方法:
  • 将此代码分解为R函数,以尽可能少地放入闪亮的应用程序本身
  • 在没有服务器的情况下创建UI部件(或者不要太多),只是为了查看总体外观
  • 在应用程序的适当位置包含您的功能
  • 加强守则。可复制的示例、单元测试、文档、代码版本控制。。。(当与代码并行执行时,此步骤会更好)

  • 作为对Sebastien答案的补充,我想指出的是,从
    {shinny}
    V1.5.0开始,您可以直接使用
    testServer
    函数测试服务器功能,这可能是您正在寻找的

    以下是您如何实现这一目标的报告:

    库(闪亮)
    图书馆(magrittr)
    图书馆(dplyr)
    
    mod_导入服务器谢谢您!我有点不确定如何在函数中包含被动或被动值(在R会话之外运行)。但我认为您可以将输入包装到函数中(对于reactives)或构建列表(对于reactivevals)。再次感谢使用反应式
    trim\u data%slice\u sample(n=num)}获取\u mt干杯,科林!那真的很有帮助。