提问人:Subaru Spirit 提问时间:5/17/2021 最后编辑:Subaru Spirit 更新时间:5/17/2021 访问量:1030
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)
我有一个标记为 的 numericInput。
我有一个在响应中调用的 uiOutput,如果来自 numericInput 的输入发生变化,它可以有更多的模态。见下图,如果数字变为 2,将有 2 个模态框而不是 1 个。Number of modalities/ subspecialties required
modality
下面列出了上述工作的代码
# 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_minutes
modality_names()
model 1
model 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)
答:
2赞
starja
5/17/2021
#1
最后一个函数需要是 a 才能同时处理 和 .为了获得标签的字符向量,我将 a 嵌套到函数中: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)
当 in 为 时,您有时会收到错误,但对于您的功能来说,它没有区别(然后不显示名称)。input
map_chr(modality_names(),~input[[.x]])
NULL
编辑
现在包括斯巴鲁精神的解决方案来摆脱NULL
评论
0赞
Subaru Spirit
5/17/2021
非常感谢!我已经测试了它并且它有效,我还研究了如何摆脱错误,是添加 %||% "".请参见:map_chr(modality_names(),~input[[.x]]%||% "").如果有效,您可以编辑您的答案以包含这段代码吗?
1赞
starja
5/17/2021
这是一个聪明的解决方案,我已经编辑了它:)
评论