Как определить, какой наблюдатель запускается в Shiny, когда используются несколько динамических наблюдателей - PullRequest
0 голосов
/ 31 марта 2019

У меня есть набор динамических форм пользовательского интерфейса, создаваемых во вкладках.Я использовал динамические наблюдения, чтобы проверить, какая форма сохраняется.Пожалуйста, смотрите код ниже

library(shiny)

ui <- fluidPage(
  actionButton("generate_tab","Generate Tabs"),
  tabsetPanel(id="tabs",
              uiOutput('tabsN')),
  dataTableOutput("saved_tabs_output")
)

server <- function(input, output, session) {
  rv<- reactiveValues(no_of_tabs =0)

  #generating the UI dynamically
 observeEvent(input$generate_tab,{
   rv$no_of_tabs <- rv$no_of_tabs + 1
   appendTab(inputId = "tabs", 
             tabPanel(title = paste0("Tab_",rv$no_of_tabs),
             selectInput(paste0("Input",rv$no_of_tabs),paste0("Input",rv$no_of_tabs), choices = c('',LETTERS), selected = NULL),
             actionButton(paste0("submit_input",rv$no_of_tabs),"submit input")
             )
   )})

# Reading the inputs upon clicking of Submit Input in each tab
   #dynamic Observe Event needs to be set up dependent on number of Tabs (rv$no_of_tabs)

   observeEvent(lapply(paste0("submit_input",1:rv$no_of_tabs), function(x){input[[x]]

   }
   ),{
     rv$inputs <-sapply(paste0("Input",1:rv$no_of_tabs), 
                        function(x)input[[x]])

        },ignoreInit = TRUE  )



   output$saved_tabs_output <- renderDataTable({
     as.data.frame(rv$inputs) 
   })


}

shinyApp(ui, server)

, потому что несколько нажатий кнопки подтверждения проверяются в одной формулировке applyEvent lapply, она также принимает входные данные из неподтвержденных форм.Вот пример

Шаг 1: Нажмите «Создать вкладки» 4 раза, чтобы сгенерировать Tab1, Tab2, Tab3, Tab 4. Нажмите «Tab» 1 enter image description here

Шаг 2:Выберите B на вкладке 1. НЕ нажимайте Submit enter image description here

Шаг 3: Выберите D на вкладке 4 и нажмите Submit enter image description here

Желаемым выходом является то, что обновляется только Input4, а не input1, однако в этом случае и B, и D сохраняются.Есть какие-нибудь указания относительно того, как это можно исправить?

1 Ответ

0 голосов
/ 01 апреля 2019

Комментарий Geovany помог. Мне также помогла эта ссылка . Хитрость заключалась в том, чтобы связать только одного наблюдателя с каждой кнопкой отправки.

Вот код, который работает, на случай, если он кому-нибудь пригодится

library(shiny)
library(purrr)
options(shiny.reactlog = TRUE)
ui <- fluidPage(
  actionButton("generate_tab", "Generate Tabs"),
  tabsetPanel(id = "tabs",
              uiOutput('tabsN')),
  verbatimTextOutput("rvInput")

)

server <- function(input, output, session) {
  # browser()
  rv <- reactiveValues(no_of_tabs = 0L,
                       inputs = list()
                       )

  #generating the UI dynamically
  observeEvent(input$generate_tab, {
    rv$no_of_tabs <- rv$no_of_tabs + 1
    appendTab(inputId = "tabs",
              tabPanel(
                title = paste0("Tab_", rv$no_of_tabs),
                selectInput(
                  paste0("Input", rv$no_of_tabs),
                  paste0("Input", rv$no_of_tabs),
                  choices = c('', LETTERS),
                  selected = NULL
                ),
                actionButton(paste0("submit_input", rv$no_of_tabs), "submit input")
              ))
  })

  observe({
    lapply(1:rv$no_of_tabs, function(x) {
      observeEvent(input[[paste0("submit_input", x)]], {
        rv$inputs[[x]] <- input[[paste0("Input", x)]]
      })
    })
  })

  output$rvInput <- renderPrint({
    rv$inputs
  })

}

shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...