Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:从所选输入创建动态UI_R_Shiny_Shiny Reactivity_Shinyjs - Fatal编程技术网

R:从所选输入创建动态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(示例)”, 选择输入(“协变量类”、“

我正在尝试创建一个动态UI,它根据
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的评论)