Блестящий: вставка / удаление пользовательского интерфейса, индивидуально и глобально - PullRequest
0 голосов
/ 19 июня 2020

Следующий блестящий код позволяет нам вставлять и удалять пользовательский интерфейс по отдельности. На вопрос об удалении элементов пользовательского интерфейса по отдельности был дан ответ здесь .

Затем я хотел удалить весь вставленный пользовательский интерфейс глобально. И я нашел здесь полезный ответ .

Итак, есть два действия удаления, вы можете увидеть их в коде с комментариями

  • Индивидуальное удаление: он удалит n-й добавленный пользовательский интерфейс.
  • Глобальное удаление: идея состоит в том, чтобы «повторно инициализировать» приложение. В своем приложении я просто использую действие по смене вкладок, чтобы вызвать удаление всего вставленного пользовательского интерфейса.

Со следующим кодом для меня это должно работать.

Но произошло нечто очень странное. При запуске приложения выполните следующие действия:

  • Выберите какое-нибудь значение, например, X1 для переменной 1.
  • Затем нажмите на кнопке «Добавить другую строку», чтобы добавить переменную 2, и вы можете выбрать X2.
  • Повторите предыдущее действие еще 3 раза. Для каждой переменной n выберите Xn.
  • Теперь вы можете удалить, например, переменную 2 и переменную 3.
  • Затем измените вкладки. Таким образом, оставшаяся переменная 4 и элемент пользовательского интерфейса будут удалены.
  • Вы можете увидеть только одну строку. И это то, что я хотел: повторно инициализировать пользовательский интерфейс и data.frame. Затем мы можем сделать новый выбор. Но ...
  • При нажатии на «Добавить другую строку» ничего не происходит.
  • Надо 3 раза нажать, а в третий раз , вы видите, что появляется 4-я переменная.

Я не могу понять почему.

>     library(shiny)
>     
>     
>     LHSchoices <- c("X1", "X2", "X3", "X4")
>     
>     
>     #------------------------------------------------------------------------------#
>     
>     # MODULE UI ----
>     variablesUI <- function(id, number) {
>       
>       ns <- NS(id)
>       
>       tagList(
>         div(id = id,
>             fluidRow(
>               column(6,
>                      selectInput(ns("variable"),
>                                  paste0("Select Variable ", number),
>                                  choices = c("Choose" = "", LHSchoices)
>                      )
>               ),
>               
>               column(3,
>                      numericInput(ns("value.variable"),
>                                   label = paste0("Value ", number),
>                                   value = 0, min = 0
>                      )
>               ),
>               column(3,
>                      actionButton(ns("rmvv"),"Remove UI")
>               ),
>             )
>         )
>       )
>       
>     }
>     
>     #------------------------------------------------------------------------------#
>     
>     # MODULE SERVER ----
>     
>     variables <- function(input, output, session, variable.number){
>       reactive({
>         
>         req(input$variable, input$value.variable)
>         
>         # Create Pair: variable and its value
>         df <- data.frame(
>           "variable.number" = variable.number,
>           "variable" = input$variable,
>           "value" = input$value.variable,
>           stringsAsFactors = FALSE
>         )
>         
>         return(df)
>         
>       })
>     }
>     
>     #------------------------------------------------------------------------------#
>     
>     # Shiny UI ----
>     
>     ui <- fixedPage(
>       tabsetPanel(type = "tabs",id="tabs",
>                   tabPanel("t1",value="t1"),
>                   tabPanel("t2",value="t2")),
>       
>       variablesUI("var1", 1),
>       h5(""),
>       actionButton("insertBtn", "Add another line"),
>       
>       verbatimTextOutput("test1"),
>       tableOutput("test2"),
>       
>     
>     )
>     
>     # Shiny Server ----
>     
>     server <- function(input, output,session) {
>       
>       add.variable <- reactiveValues()
>       add.variable$df <- data.frame("variable.number" = numeric(0),
>                                     "variable" = character(0),
>                                     "value" = numeric(0),
>                                     stringsAsFactors = FALSE)
>       
>       var1 <- callModule(variables, paste0("var", 1), 1)
>       
>       observe(add.variable$df[1, ] <- var1())
>       
>       rv <- reactiveValues(value = 0)
>       
>       observeEvent(input$insertBtn, {
>         
>         btn <- rv$value + 1
>         rv$value <- btn
>         
>         insertUI(
>           selector = "h5",
>           where = "beforeEnd",
>           ui = tagList(
>             variablesUI(paste0("var", btn), btn)
>           )
>         )
>         
>         newline <- callModule(variables, paste0("var", btn), btn)
>         
>         observeEvent(newline(), {
>           add.variable$df[btn, ] <- newline()
>         })
>         
>         # individual deletion
>         
>         observeEvent(input[[paste0("var", btn,"-rmvv")]], {
>           removeUI(
>             selector = paste0("#var", btn)
>           )
>         })
>         
>         
>       })
>       
>       # global deletion
>       observeEvent(input$tabs, {
>         print("change")
>         
>         print(rv$value)
>         
>         if (rv$value >1){
>           for (bb in 2:rv$value){
>             removeUI(
>               selector = paste0("#var", bb)
>             )
>             
>           }
>           add.variable$df[1:(rv$value), ]=NA
>         }
>         
>         
>         rv$value=1
>         
>       })
>       
>       
>       output$test1 <- renderPrint({
>         print(add.variable$df)
>       })
>       
>       output$test2 <- renderTable({
>         add.variable$df
>       })
>       
>     }
>     
>     #------------------------------------------------------------------------------#
>     
>     shinyApp(ui, server)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...