【问题标题】:Passing renderUI from Shiny Module to Next Module将 renderUI 从 Shiny Module 传递到 Next Module
【发布时间】:2020-05-27 06:18:27
【问题描述】:

我正在创建一个应用程序来跟踪游戏数据并免费分发,因为似乎需要(阅读:想要)这样的东西。该应用程序接受关于应该有多少玩家的初始输入,然后反应性地允许为每个玩家输入数据。然后,我想将所有接收到的数据呈现为一个数据表,可以在下一页下载。

我最近开始模块化我的应用程序以保持整洁。虽然,由于某种原因,我无法让这个工作。我认为这是因为我正在尝试将 renderUI 输入从一个模块传递到下一个模块,但显然不知道该怎么做

我收到的错误是:

Error in module(childScope$input, childScope$output, childScope, ...) : 
  object 'player_id' not found

不过,我收到了许多不同的解决方案。

为了记录,我检查了: pass renderUI input from one Shiny module to another

和:https://community.rstudio.com/t/modularizing-an-app-with-dynamic-inputs-renderui/1454

这似乎很接近......

这是一个非常简单的示例,其中包含 app.R 中的模块(否则我将获取它们)。

library(shiny)

######################## -- Data Input Module -- ######################## 
datatrackingUI <- function(id){
  ns <- NS(id)
  fluidPage(
    column(4, offset = 4,
           sliderInput(inputId = ns("players"),
                       label = "How many players do you have?",
                       min = 0,
                       max = 4,
                       value = 4)),
    column(12,
           uiOutput(ns("ui_reactive"))
    )
  )

}

datatracking <- function(input, output, session){
  ns <- session$ns

  output$ui_reactive <- renderUI({
    lapply(seq_len(input$players), function(i){
      column(4,
             wellPanel(
               textInput(inputId = ns("player_id"),
                         label = paste0("Enter the ID for player ", i),
                         placeholder = "Brennan")))})

  })

  df_list <- list(player_id = player_id)
  return(df_list)

}

######################## -- Create Data Table Module -- ######################## 
createTableUI <- function(id){
  ns <- NS(id)

  fluidPage(
    renderUI("some_text_for_now")
  )
}

createTable <- function(input, output, sesssion, df_list){
  ns <- session$ns
  output$some_text_for_now <- renderText({
    print(df_list$player_id())
  })

}



######################## -- Shiny App -- ######################## 
ui <- fluidPage(
  navbarPage("Game",
             tabPanel("Input",
                      hr(),
                      datatrackingUI("create_data")),
             tabPanel("Table",
                      hr(),
                      createTableUI("create_table"))
  )
)

server <- function(input, output, session) {
   df_list <- callModule(datatracking, "create_data")
   callModule(createTable, "create_table", df_list)
}

shinyApp(ui = ui, server = server)

所以,就目前而言,我只是想向自己展示我有来自 renderUI 函数的输出。一旦我可以访问输入,我就可以处理创建数据表/推送到 AWS!

感谢任何帮助!或者,如果你想和我一起做这个项目,那可能会很有趣!给我留言以获取更多信息。

-布伦南

【问题讨论】:

    标签: r shiny module


    【解决方案1】:

    您的代码中有两个简单的问题:

    • 当您在模块datatracking 中定义df_list 时,您不使用input,因此没有任何反应。相反,您应该这样做:
     df_list <- list(
        player_id = reactive(input$player_id)
      )
    
    • 当您定义 createTable 模块时,session 中有 3 个 s,因此您必须更正此错字。

    完整的工作示例:

    library(shiny)
    
    ######################## -- Data Input Module -- ######################## 
    datatrackingUI <- function(id){
      ns <- NS(id)
      fluidPage(
        column(4, offset = 4,
               sliderInput(inputId = ns("players"),
                           label = "How many players do you have?",
                           min = 0,
                           max = 4,
                           value = 4)),
        column(12,
               uiOutput(ns("ui_reactive"))
        )
      )
    
    }
    
    datatracking <- function(input, output, session){
      ns <- session$ns
    
      output$ui_reactive <- renderUI({
        lapply(seq_len(input$players), function(i){
          column(4,
                 wellPanel(
                   textInput(inputId = ns("player_id"),
                             label = paste0("Enter the ID for player ", i),
                             placeholder = "Brennan")))})
    
      })
    
      df_list <- list(
        player_id = reactive(input$player_id)
      )
      return(df_list)
    
    }
    
    ######################## -- Create Data Table Module -- ######################## 
    createTableUI <- function(id){
      ns <- NS(id)
    
      fluidPage(
        renderUI("some_text_for_now")
      )
    }
    
    createTable <- function(input, output, session, df_list){
      ns <- session$ns
      output$some_text_for_now <- renderText({
        print(df_list$player_id())
      })
    
    }
    
    
    
    ######################## -- Shiny App -- ######################## 
    ui <- fluidPage(
      navbarPage("Game",
                 tabPanel("Input",
                          hr(),
                          datatrackingUI("create_data")),
                 tabPanel("Table",
                          hr(),
                          createTableUI("create_table"))
      )
    )
    
    server <- function(input, output, session) {
      df_list <- callModule(datatracking, "create_data")
      callModule(createTable, "create_table", df_list = df_list)
    }
    
    shinyApp(ui = ui, server = server)
    

    【讨论】:

    • 感谢您的回复!但是,当我在 inputText 中放置 id 值时,它仍然不会在“表格”页面上打印任何内容?
    • 好的...我已将其修复为原始版本。所以,一切都好!当我发布这个时,我一定已经看它太久了!!感谢您的细心和良好的捕捉。
    猜你喜欢
    • 2018-03-15
    • 1970-01-01
    • 2017-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-26
    • 1970-01-01
    相关资源
    最近更新 更多