0

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

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

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

模态 模态2

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

# 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 ui_modality_minutes,但对于标签,我想使用来自输入的标签modality_names()。请看下图以更好地理解我的目标。我希望 input1model 1成为第一个标签,而 input2model 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]])))
  })

模组1 模组2

可重现的代码如下所示,

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)
4

1 回答 1

2

您的最后一个map函数需要是 amap2才能同时处理inputId和的生成label。为了获得标签的字符向量,我将 a 嵌套map_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)

input当in map_chr(modality_names(),~input[[.x]])is时,您有时会遇到错误NULL,但对于您的功能而言,它没有任何区别(然后没有显示名称)。

编辑

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

于 2021-05-17T15:00:25.480 回答