R:从所选输入创建动态UI
我正在尝试创建一个动态UI,它根据R:从所选输入创建动态UI,r,shiny,shiny-reactivity,shinyjs,R,Shiny,Shiny Reactivity,Shinyjs,我正在尝试创建一个动态UI,它根据selectInput()命令中所选变量的数量生成N个部分。对于选择的每个变量,我希望有自己的部分,允许您进一步指定该变量的其他属性(例如,如果是数字或字符,如何插补缺失值,等等) 我有insertUI()和removeUI()的经验,并且能够生成一个我希望它看起来像什么的小示例。我的代码中执行此操作的部分如下所示: insertUI( 选择器=“#ui_测试”, ui=标记$div(id=“额外标准”, h4(“协变量1(示例)”, 选择输入(“协变量类”、“
selectInput()
命令中所选变量的数量生成N个部分。对于选择的每个变量,我希望有自己的部分,允许您进一步指定该变量的其他属性(例如,如果是数字或字符,如何插补缺失值,等等)
我有insertUI()
和removeUI()
的经验,并且能够生成一个我希望它看起来像什么的小示例。我的代码中执行此操作的部分如下所示:
insertUI(
选择器=“#ui_测试”,
ui=标记$div(id=“额外标准”,
h4(“协变量1(示例)”,
选择输入(“协变量类”、“协变量类”,
选项=c(“数字”、“字符”),
选择输入(“cov_1_插补”、“插补”,
选项=c(“默认值”、“平均值”、“模式”、“中值”),
textInput(“cov_1_插补_默认水平”、“插补默认水平”、“0”),
标记$hr(),
h4(“协变量2(示例)”,
选择输入(“协变量类”、“协变量类”,
选项=c(“数字”、“字符”),
选择输入(“cov_2_插补”、“插补”,
选项=c(“默认值”、“平均值”、“模式”、“中值”),
textInput(“cov_2_插补_默认水平”、“插补默认水平”、“0”),
标记$hr(),
h4(“协变量3(示例)”,
选择输入(“协变量3类”、“协变量类”,
选项=c(“数字”、“字符”),
选择输入(“cov_3_插补”、“插补”,
选项=c(“默认值”、“平均值”、“模式”、“中值”),
textInput(“cov_3_插补_默认水平”、“插补默认水平”、“0”),
标记$hr(),
h4(“协变量4(示例)”,
选择输入(“协变量类”、“协变量类”,
选项=c(“数字”、“字符”),
选择输入(“cov_4_插补”、“插补”,
选项=c(“默认值”、“平均值”、“模式”、“中值”),
textInput(“cov_4_插补_默认水平”、“插补默认水平”、“0”)
)
)
我想完成的是使上面的部分变得健壮和动态,如果用户只选择2个变量,那么我只想创建h4(“协变量1(示例)”)
和h4(“协变量2(示例)”)
。例如,如果选择了age
和sex
,那么我希望我的部分看起来像:
insertUI(
选择器=“#ui_测试”,
ui=标记$div(id=“额外标准”,
h4(“年龄”),
选择输入(“年龄组”、“协变量组”,
选项=c(“数字”、“字符”),
选择输入(“年龄估算”、“估算”,
选项=c(“默认值”、“平均值”、“模式”、“中值”),
textInput(“年龄输入默认水平”、“输入默认水平”、“0”),
标记$hr(),
h4(“性别”),
选择输入(“性别类别”、“协变量类别”,
选项=c(“数字”、“字符”),
选择输入(“性别输入”、“输入”,
选项=c(“默认值”、“平均值”、“模式”、“中值”),
textInput(“性别输入默认水平”、“输入默认水平”、“0”)
)
)
我最初打算通过在所选输入中的变量上循环并创建所需输出的长字符串(即h4(协变量N)
)块),然后通过eval(parse(text=“…”)将其传递给)。最终会是这样的:
insertUI(
选择器=“#ui_测试”,
ui=标记$div(id=“额外标准”,
eval(解析(text=“…”))
)
)
其中,“…”
部分是h4(“协变量N”)的块
被视为字符串。现在,我不知道这是否有效,但这是我目前唯一的方法。是否有更好的方法来解决这个问题,也许是使用中的一些函数。
将非常感谢任何帮助或建议。我的模拟示例可以在下面找到:
库(闪亮)
图书馆(shinyjs)
ui在insertUI
函数的描述页面中,它说:
与renderUI()不同,使用insertUI()生成的UI是持久的:
创建后,它将一直保留在那里,直到被removeUI()删除。每个
对insertUI()的新调用除了创建
已经存在的(彼此独立)。要更新
作为UI的一部分(例如:输入对象),必须使用适当的
渲染函数或自定义的反应函数
因此,您不能在此处使用insertUI
。而是使用renderUI
函数和uiOutput
动态生成ui元素
接下来,要基于选择多次生成ui,您可以使用lappy
。因为迭代次数将取决于向量中的项目数,即input$
对象;生成的ui数量将基于选择次数
我认为下面的代码解决了您的问题:
library(shiny)
library(shinyjs)
ui <- shinyUI(fluidPage(
shinyjs::useShinyjs(),
navbarPage("Test",id="navbarPage",
tabPanel("First tab", id = "first_tab",
sidebarLayout(
sidebarPanel(
selectInput('covariates', 'Select covariates', choices = c("age","sex","race","bmi"), multiple=TRUE, selectize=TRUE),
actionButton("set.covariates","Set"),
tags$hr(),
uiOutput("covariateop")
),
mainPanel(
verbatimTextOutput("list")
)
)
))
))
# Define server logic required to draw a histogram
server <- shinyServer(function(input, output, session) {
observe({
if (is.null(input$covariates) || input$covariates == "") {
shinyjs::disable("set.covariates")
} else {
shinyjs::enable("set.covariates")
}
})
observeEvent(input$set.covariates, {
shinyjs::disable("set.covariates")
})
prep.list <- eventReactive(input$set.covariates,{
cov <- input$covariates
timeIndep.list <- NULL
for(L0.i in seq_along(cov)){
timeIndep.list[[L0.i]] <- list("categorical"=FALSE,
"impute"=NA,
"impute_default_level"=NA)
}
names(timeIndep.list) <- cov
return(timeIndep.list)
})
output$list <- renderPrint({
prep.list()
})
observeEvent(req(input$set.covariates), {
insertUI(
selector = '#ui_test',
ui = tags$div(id = "extra_criteria",
h4("Covariate 1 (example)"),
selectInput("cov_1_class", "Covariate class",
choices = c("numeric","character")),
selectInput("cov_1_impute", "Impute",
choices = c("default","mean","mode","median")),
textInput("cov_1_impute_default_level", "Impute default level","0"),
tags$hr(),
h4("Covariate 2 (example)"),
selectInput("cov_2_class", "Covariate class",
choices = c("numeric","character")),
selectInput("cov_2_impute", "Impute",
choices = c("default","mean","mode","median")),
textInput("cov_2_impute_default_level", "Impute default level","0"),
tags$hr(),
h4("Covariate 3 (example)"),
selectInput("cov_3_class", "Covariate class",
choices = c("numeric","character")),
selectInput("cov_3_impute", "Impute",
choices = c("default","mean","mode","median")),
textInput("cov_3_impute_default_level", "Impute default level","0"),
tags$hr(),
h4("Covariate 4 (example)"),
selectInput("cov_4_class", "Covariate class",
choices = c("numeric","character")),
selectInput("cov_4_impute", "Impute",
choices = c("default","mean","mode","median")),
textInput("cov_4_impute_default_level", "Impute default level","0")
)
)})
observeEvent(req(input$set.covariates), {
output$covariateop <- renderUI({
lapply(input$covariates, function(x){
tags$div(id = paste0("extra_criteria_for_", x),
h4(x),
selectInput("cov_1_class", "Covariate class",
choices = c("numeric","character")),
selectInput("cov_1_impute", "Impute",
choices = c("default","mean","mode","median")),
textInput("cov_1_impute_default_level", "Impute default level","0"),
tags$hr()
)
})
})
})
observeEvent({input$covariates}, {
removeUI(selector = '#extra_criteria')
})
})
# Run the application
shinyApp(ui = ui, server = server)
库(闪亮)
图书馆(shinyjs)
ui可能会有帮助(特别是Paul的评论)