これは以前のクエリ[Creating asymmetric layouts involving rows and column in Shinyの拡張です。私は動的なUI出力を作成しようとしています。各トピックごとにドロップダウンメニューとテキストボックスをグループ化してレイアウトを修正するための提案や、動的に作成されたさまざまなドロップダウンやテキストボックスからデータを取り込む方法についても提案が必要です。RShinyの動的フォーム
これは、以前のクエリ[How to add/remove input fields dynamically by a button in shinyから変更されたコードである:あなたのレイアウトの問題を解決するための
library(shiny)
ui <- shinyUI(fluidPage(
sidebarPanel(
actionButton("add_btn", "Add Textbox"),
actionButton("rm_btn", "Remove Textbox"),
textOutput("counter")
),
mainPanel(
fluidRow(column(6,uiOutput("selectbox_ui"), offset = 0),
column(6,fluidRow(column(6,uiOutput("textbox_ui1"), uiOutput("textbox_ui2"))),
fluidRow(column(6,uiOutput("textbox_ui3"), uiOutput("textbox_ui4"),offset = 0)), offset = 0)
)
)))
server <- shinyServer(function(input, output, session) { session$onSessionEnded(stopApp)
# Track the number of input boxes to render
counter <- reactiveValues(n = 0)
observeEvent(input$add_btn, {counter$n <- counter$n + 1})
observeEvent(input$rm_btn, {if (counter$n > 0) counter$n <- counter$n - 1})
output$counter <- renderPrint(print(counter$n))
textboxes1 <- reactive({n <- counter$n
if (n > 0)
{lapply(seq_len(n), function(i) {textInput(inputId = paste0("textin1", i),label = paste0("Textbox_A_Topic", i), value = "Hello World!")})}
})
textboxes2 <- reactive({n <- counter$n
if (n > 0)
{lapply(seq_len(n), function(i) {textInput(inputId = paste0("textin2", i),label = paste0("Textbox_B_Topic", i), value = "Hello World!")} )}
})
textboxes3 <- reactive({n <- counter$n
if (n > 0)
{lapply(seq_len(n), function(i) {textInput(inputId = paste0("textin3", i),label = paste0("Textbox_C_Topic", i), value = "Hello World!")} )}
})
textboxes4 <- reactive({n <- counter$n
if (n > 0)
{lapply(seq_len(n), function(i) {textInput(inputId = paste0("textin4", i),label = paste0("Textbox_D_Topic", i), value = "Hello World!")} )}
})
selectboxes <- reactive({n <- counter$n
if (n > 0)
{lapply(seq_len(n), function(i) {selectInput(inputId = paste0("selectTopic", i), label = paste0("Topic", i),
choices = c("one", "two", "three"), selected = "two", multiple = FALSE)})}
})
output$textbox_ui1 <- renderUI(textboxes1())
output$textbox_ui2 <- renderUI({textboxes2() })
output$textbox_ui3 <- renderUI({textboxes3() })
output$textbox_ui4 <- renderUI({textboxes4() })
output$selectbox_ui <- renderUI({selectboxes()})
})
私が今直面している問題は、テキストボックスを入力した後、追加ボタンをクリックしてデータを追加すると、入力された値を 'Hello world'値で置き換えた新しいテキストボックスが作成されますテキストボックス。 – RanonKahn
私はそれを回避するには2つの方法が考えられます:すべての入力要素の現在の状態をリアクティブリストに保存し、それらの状態を使用してボックスを追加または削除するときに古い入力を再作成します(https: //stackoverflow.com/a/31457114/4550695);またはトピックの量が最大であれば、それらを一度にすべて作成し、実際にそれらを追加および削除するのではなく、 'shinyjs'を使用してカウンター値に応じて動的に表示および非表示にします。 –
私は2番目のオプションを使用します。 – RanonKahn