R Shiny uiOutput 显示来自另一个 uiOutput 的输入值的标签
R Shiny uiOutput to display the label from the input value from another uiOutput
标题可能很混乱,但我会在下面详细解释我的问题。我使用“掌握闪亮”一书第 10 节“动态 UI”作为指导。 R中使用的库是
library(shiny)
library(tidyverse)
library(purrr)
我有一个标记为 Number of modalities/ subspecialties required
的 numericInput。
我有一个名为 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)
您的最后一个 map
函数需要是 map2
才能同时处理 inputId
和 label
的生成。为了获得标签的字符向量,我将 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]])
中的 input
为 NULL
时,您有时会收到错误消息,但对于您的功能而言,这并没有什么不同(那么不会显示任何名称)。
编辑
现在包括斯巴鲁精灵摆脱的解决方案NULL
标题可能很混乱,但我会在下面详细解释我的问题。我使用“掌握闪亮”一书第 10 节“动态 UI”作为指导。 R中使用的库是
library(shiny)
library(tidyverse)
library(purrr)
我有一个标记为 Number of modalities/ subspecialties required
的 numericInput。
我有一个名为 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)
您的最后一个 map
函数需要是 map2
才能同时处理 inputId
和 label
的生成。为了获得标签的字符向量,我将 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]])
中的 input
为 NULL
时,您有时会收到错误消息,但对于您的功能而言,这并没有什么不同(那么不会显示任何名称)。
编辑
现在包括斯巴鲁精灵摆脱的解决方案NULL