gpt4 book ai didi

R Shiny - 在 Shiny 模块中插入动态 UI

转载 作者:行者123 更新时间:2023-12-04 01:43:34 25 4
gpt4 key购买 nike

下面的应用程序包含一个模块,该模块在每次 Add 时插入一个 UI 对象。按钮被点击。 UI 对象由两个输入组成:

  • 输入 1 是 selectInput有选择AB .
  • 输入 2 是 textInput如果用户选择A和一个numericInput如果他们选择B .

  • 但是,当我单击 Add , 插入的 UI 只包含 Input 1 ( selectInput ) - Input 2 没有渲染,如下图:

    enter image description here

    而所需的输出如下所示:

    enter image description here

    我不确定这是否是命名空间问题,或者模块的范围是否存在问题。将 ID 打印到控制台检查:

    enter image description here

    该应用程序如下:
    library(shiny)

    # module UI function
    modUI <- function(id){

    ns <- NS(id)

    tagList(
    actionButton(ns('add'), 'Add'),
    div(id = ns('placeholder'))
    )
    }

    # module server function
    modServer <- function(input, output, session) {

    ns = session$ns

    ctn <- reactiveVal(0)

    Id <- reactive({
    function(id){
    ns(paste0(id, ctn()))
    }
    })

    observeEvent(input$add, {

    ctn(ctn() + 1)

    insertUI(
    selector = paste0('#', ns('placeholder')),
    ui = div(
    id = Id()('div'),
    selectInput(Id()('letter'), 'Letter:', LETTERS[1:2]),
    uiOutput(Id()('input'))
    )
    )
    })

    observeEvent(ctn(), {

    id <- Id()('input')
    selection <- Id()('letter')
    print(list(id = id, selection = selection))

    req(input[[selection]])

    output[[id]] <- renderUI({

    req(input[[selection]])

    switch(
    input[[selection]],
    'A' = textInput(Id()('text'), 'ENTER TEXT', ''),
    'B' = numericInput(Id()('numeric'), 'ENTER NUMBER', '')
    )
    })

    }, ignoreInit = TRUE)
    }

    # main ui
    ui <- fluidPage(
    modUI('mod1')
    )

    # main server
    server <- function(input, output, session) {
    callModule(modServer, "mod1")
    }

    # run app
    shinyApp(ui, server)

    我尝试将模块拆分为内部和外部模块。内部模块创建输入 1 和输入 2,外部模块使用 insertUI 将它们插入到主应用程序中。 .这给了我和以前一样的结果。可以在下面查看此代码:

    library(shiny)


    # INNER MOD ---------------------------------------------------------------

    innermodUI <- function(id) {

    ns = NS(id)

    tagList(
    selectInput(ns('letter'), 'Letter:', LETTERS[1:2]),
    uiOutput(ns('names'))
    )
    }

    innermodServer <- function(input, output, session) {

    ns = session$ns

    output$names <- renderUI({

    selection = req(input$letter)

    switch(
    selection,
    'A' = textInput(ns('text'), 'ENTER TEXT', ''),
    'B' = numericInput(ns('numeric'), 'ENTER NUMBER', '')
    )
    })
    }


    # OUTER MOD ---------------------------------------------------------------

    modUI <- function(id){

    ns <- NS(id)

    tagList(
    actionButton(ns('add'), 'Add'),
    div(id = ns('placeholder'))
    )
    }

    modServer <- function(input, output, session) {

    ns = session$ns

    ctn <- reactiveVal(0)

    Id <- reactive({
    function(id){
    ns(paste0(id, ctn()))
    }
    })

    observeEvent(input$add, {

    ctn(ctn() + 1)

    filterId = Id()('filter')

    insertUI(
    selector = paste0('#', ns('placeholder')),
    ui = innermodUI(filterId)
    )

    callModule(innermodServer, filterId)

    })
    }


    # MAIN --------------------------------------------------------------------

    ui <- fluidPage(
    modUI('mod1')
    )

    server <- function(input, output, session) {
    callModule(modServer, "mod1")
    }

    shinyApp(ui, server)


    我还尝试包装 renderUIshinyjs::delay()无济于事。我非常感谢任何帮助,因为我不精通 Shiny 模块并且不知道接下来要尝试什么。

    最佳答案

    我已经设法通过多次试验错误使其工作。据我了解(我还是 Shiny 模块的新手),您必须使用 session$ns仅适用于在服务器中创建的输入。

    library(shiny)

    # module UI function
    modUI <- function(id){

    ns <- NS(id)

    tagList(
    actionButton(ns('add'), 'Add'),
    div(id = ns('placeholder'))
    )
    }

    # module server function
    modServer <- function(input, output, session) {

    ns = session$ns

    ctn <- reactiveVal(0)

    Id <- reactive({
    function(id){
    paste0(id, ctn())
    }
    })
    IdNS <- reactive({
    function(id){
    ns(paste0(id, ctn()))
    }
    })

    observeEvent(input$add, {

    ctn(ctn() + 1)

    insertUI(
    selector = paste0('#', ns('placeholder')),
    ui = div(
    id = Id()('div'),
    selectInput(IdNS()('letter'), 'Letter:', LETTERS[1:2]),
    uiOutput(IdNS()('input'))
    )
    )
    })

    observeEvent(ctn(), {

    id <- Id()('input')
    selection <- Id()('letter')

    output[[id]] <- renderUI({

    switch(
    input[[selection]],
    'A' = textInput(IdNS()('text'), 'ENTER TEXT', ''),
    'B' = numericInput(IdNS()('numeric'), 'ENTER NUMBER', '')
    )

    })

    }, ignoreInit = TRUE)
    }

    # main ui
    ui <- fluidPage(
    modUI('mod1')
    )

    # main server
    server <- function(input, output, session) {
    callModule(modServer, "mod1")
    }

    # run app
    shinyApp(ui, server)

    关于R Shiny - 在 Shiny 模块中插入动态 UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56407118/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com