R Shiny uiOutput 显示来自另一个 uiOutput 的输入值的标签

R Shiny uiOutput to display the label from the input value from another uiOutput

提问人:Subaru Spirit 提问时间:5/17/2021 最后编辑:Subaru Spirit 更新时间:5/17/2021 访问量:1030

问:

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

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

我有一个标记为 的 numericInput。
我有一个在响应中调用的 uiOutput,如果来自 numericInput 的输入发生变化,它可以有更多的模态。见下图,如果数字变为 2,将有 2 个模态框而不是 1 个。
Number of modalities/ subspecialties requiredmodality

modality modality2

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

# 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 将标签作为模态名称中的输入。以下是我处理问题的方式。我创建了另一个名为 的 uiOutput,但对于标签,我想使用输入中的标签。请看下图,以更好地理解我的目标。我希望 input1 是第一个标签,input2 是第二个标签,但我的代码会将模型 1 和模型 2 一起添加,而不是单独添加。ui_modality_minutesmodality_names()model 1model 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]])))
  })

mod1 mod2

可重现的代码如下所示,

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 闪亮 的动态-UI UI输出

评论


答:

2赞 starja 5/17/2021 #1

最后一个函数需要是 a 才能同时处理 和 .为了获得标签的字符向量,我将 a 嵌套到函数中:mapmap2inputIdlabelmap_chrmap2

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)

当 in 为 时,您有时会收到错误,但对于您的功能来说,它没有区别(然后不显示名称)。inputmap_chr(modality_names(),~input[[.x]])NULL

编辑

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

评论

0赞 Subaru Spirit 5/17/2021
非常感谢!我已经测试了它并且它有效,我还研究了如何摆脱错误,是添加 %||% "".请参见:map_chr(modality_names(),~input[[.x]]%||% "").如果有效,您可以编辑您的答案以包含这段代码吗?
1赞 starja 5/17/2021
这是一个聪明的解决方案,我已经编辑了它:)