gpt4 book ai didi

insertUI中的R Shiny 动态UI

转载 作者:行者123 更新时间:2023-12-04 04:05:28 30 4
gpt4 key购买 nike

我有一个 Shiny 的应用程序,我想使用操作按钮添加一个 UI 元素,然后让插入的 ui 是动态的。

这是我当前的ui文件:

library(shiny)

shinyUI(fluidPage(
div(id="placeholder"),
actionButton("addLine", "Add Line")
))

和服务器文件:
library(shiny)

shinyServer(function(input, output) {
observeEvent(input$addLine, {
num <- input$addLine
id <- paste0("ind", num)
insertUI(
selector="#placeholder",
where="beforeBegin",
ui={
fluidRow(column(3, selectInput(paste0("selected", id), label=NULL, choices=c("choice1", "choice2"))))
})
})

})

如果 choice1在特定的 ui 元素中被选中,我想添加一个 textInput到行。如果 choice2在 ui 元素中被选中,我想添加一个 numericInput .

虽然我通常了解如何创建响应用户输入而变化的 react 值,但我不知道在这里做什么,因为我不知道如何观察尚未创建的元素并且我不知道名称的。任何帮助将不胜感激!

最佳答案

代码

这可以通过 modules 轻松解决:

library(shiny)

row_ui <- function(id) {
ns <- NS(id)
fluidRow(
column(3,
selectInput(ns("type_chooser"),
label = "Choose Type:",
choices = c("text", "numeric"))
),
column(9,
uiOutput(ns("ui_placeholder"))
)
)
}

row_server <- function(input, output, session) {
return_value <- reactive({input$inner_element})
ns <- session$ns
output$ui_placeholder <- renderUI({
type <- req(input$type_chooser)
if(type == "text") {
textInput(ns("inner_element"), "Text:")
} else if (type == "numeric") {
numericInput(ns("inner_element"), "Value:", 0)
}
})

## if we later want to do some more sophisticated logic
## we can add reactives to this list
list(return_value = return_value)
}

ui <- fluidPage(
div(id="placeholder"),
actionButton("addLine", "Add Line"),
verbatimTextOutput("out")
)

server <- function(input, output, session) {
handler <- reactiveVal(list())
observeEvent(input$addLine, {
new_id <- paste("row", input$addLine, sep = "_")
insertUI(
selector = "#placeholder",
where = "beforeBegin",
ui = row_ui(new_id)
)
handler_list <- isolate(handler())
new_handler <- callModule(row_server, new_id)
handler_list <- c(handler_list, new_handler)
names(handler_list)[length(handler_list)] <- new_id
handler(handler_list)
})

output$out <- renderPrint({
lapply(handler(), function(handle) {
handle()
})
})
}

shinyApp(ui, server)

解释

模块是一段模块化的代码,您可以根据需要多次重复使用它,而不必担心唯一名称,因为模块在 namespaces 的帮助下处理了这些问题。 .

一个模块由两部分组成:
  • 一个 UI功能
  • 一个 server功能

  • 它们和普通的 UI 非常相似。和 server功能,有一些事情要记住:
  • namespacing :在服务器中,您可以访问 UI 中的元素就像你通常做的那样,例如 input$type_chooser .但是,在 UI部分,你必须 namespace您的元素,通过使用 NS ,它返回一个函数,您可以在其余代码中方便地使用该函数。为此,UI函数接受一个参数 id可以将其视为此模块的任何实例的(唯一)命名空间。元素 ids在模块中必须是唯一的,并且由于命名空间,它们在整个应用程序中也是唯一的,即使您使用模块的多个实例。
  • UI : 作为你的UI是一个函数,它只有一个返回值,您必须将元素包装在 tagList 中如果您想返回多个元素(此处不需要)。
  • server : 你需要 session参数,否则是可选的。如果您希望您的模块与主应用程序通信,您可以传入一个(响应式(Reactive))参数,您可以在模块中照常使用该参数。同样,如果您希望您的主应用程序使用模块中的某些值,您应该返回响应式(Reactive),如代码所示。如果您愿意创建 UI您的服务器函数中的元素,您还需要命名它们,并且您不能通过 session$ns 访问命名空间函数如图所示。
  • usage : 要使用您的模块,请插入 UI通过使用唯一的 id 调用函数来加入您的主应用程序.然后你必须调用callModule为了使服务器逻辑正常工作,您在其中传入相同的 id .此调用的返回值为 returnValue您的模块服务器功能,并且可以被起诉以在主应用程序中使用模块内的值。

  • 简而言之,这解释了模块。 here. 是一个非常好的教程,它更详细和完整地解释了模块。

    关于insertUI中的R Shiny 动态UI,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55461532/

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