【问题标题】:R Shiny uiOutput to display the label from the input value from another uiOutputR Shiny uiOutput 显示来自另一个 uiOutput 的输入值的标签
【发布时间】:2021-08-06 20:17:12
【问题描述】:

标题可能很混乱,但我会尝试在下面详细解释我的问题。我使用“掌握闪亮”一书第 10 节“动态 UI”作为指导。 R中使用的库是

library(shiny)
library(tidyverse)
library(purrr)

我有一个 numericInput 标记为 Number of modalities/ subspecialties required
我有一个名为 modality 的 uiOutput 作为响应,如果来自 numericInput 的输入发生变化,它可以有更多的模式。见下图,如果数字变为 2,就会有 2 个模态框,而不是 1 个。

下面列出了上述工作的代码

# UI
numericInput("No_modalities", label = "Number of modalities/
                              subspecialties required",
                              value = 1, min = 1, max = 100, step = 1)
uiOutput("modality")

# Server
modality_names <- reactive(paste0("Modality ", seq_len(input$No_modalities)))

output$modality <- renderUI({
    map(modality_names(), ~ textInput(.x, label = paste(.x," Name"),
                                         value = isolate(input[[.x]])))
  })

现在我想要另一个 uiOutput 将标签作为模态名称中的输入。这是我解决问题的方法。我创建了另一个名为 ui_modality_minutes 的 uiOutput,但对于标签,我想使用来自 modality_names() 的输入中的标签。请看下图以更好地理解我的目标。我希望 input1 model 1 成为第一个标签, input2 model 2 成为第二个标签,但我的代码会将模型 1 和模型 2 一起添加,而不是单独添加。

# UI
uiOutput("ui_modality_minutes")

# Server
modality_minutes <- reactive(paste0("Modality minutes ",
                                      seq_len(input$No_modalities)))

output$ui_modality_minutes <- renderUI({
    map(modality_minutes(), ~ numericInput(.x, 
                          label = map(modality_names(),~input[[.x]]),
                          value = isolate(input[[.x]])))
  })

可重现的代码如下所示,

library(shiny)
library(tidyverse)
library(purrr)

ui <- fluidPage(
  fluidRow(
  numericInput("No_modalities", label = "Number of modalities/
                              subspecialties required",
               value = 1, min = 1, max = 100, step = 1)),
  fluidRow(
    uiOutput("modality")
  ),
  fluidRow(
    uiOutput("ui_modality_minutes")
  )
)

server <- function(input, output, session) {
  modality_names <- reactive(paste0("Modality ", seq_len(input$No_modalities)))
  modality_minutes <- reactive(paste0("Modality minutes ",
                                      seq_len(input$No_modalities)))
  
  output$modality <- renderUI({
    map(modality_names(), ~ textInput(.x, label = paste(.x," Name"),
                                      value = isolate(input[[.x]])))
  })
  output$ui_modality_minutes <- renderUI({
    map(modality_minutes(), ~ numericInput(.x, 
                                           label = map(modality_names(),~input[[.x]]),
                                           value = isolate(input[[.x]])))
  })
}

shinyApp(ui, server)

【问题讨论】:

    标签: r shiny dynamic-ui uioutput


    【解决方案1】:

    您的最后一个map 函数必须是map2 才能同时处理inputIdlabel 的生成。为了获得标签的字符向量,我将 map_chr 嵌套到 map2 函数中:

    library(purrr)
    library(shiny)
    
    ui <- fluidPage(
      numericInput("No_modalities", label = "Number of modalities/
                                  subspecialties required",
                   value = 1, min = 1, max = 100, step = 1),
      uiOutput("modality"),
      uiOutput("ui_modality_minutes")
    )
    
    server <- function(input, output, session) {
      modality_names <- reactive(paste0("Modality ", seq_len(input$No_modalities)))
      
      output$modality <- renderUI({
        map(modality_names(), ~ textInput(.x, label = paste(.x," Name"),
                                          value = isolate(input[[.x]])))
      })
      modality_minutes <- reactive(paste0("Modality minutes ",
                                          seq_len(input$No_modalities)))
      
      output$ui_modality_minutes <- renderUI({
        map2(modality_minutes(), map_chr(modality_names(),~input[[.x]]%||% ""), ~ numericInput(.x, 
                                               label = .y,
                                               value = isolate(input[[.x]])))
      })
    }
    
    shinyApp(ui, server)
    

    map_chr(modality_names(),~input[[.x]]) 中的inputNULL 时,您有时会收到错误消息,但对于您的功能而言,这并没有什么不同(然后没有显示名称)。

    编辑

    现在包括斯巴鲁精神摆脱NULL的解决方案

    【讨论】:

    • 非常感谢!我已经测试过它并且它有效,我还想出了如何摆脱错误,就是添加 %||% ""。参见:map_chr(modality_names(),~input[[.x]]%||% "")。如果可行,您可以编辑您的答案以包含这段代码吗?
    • 这是一个聪明的解决方案,我已经编辑了它:)
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2019-08-12
    • 1970-01-01
    • 2020-09-29
    • 1970-01-01
    • 2020-08-01
    • 2018-09-29
    • 2021-04-10
    相关资源
    最近更新 更多