【问题标题】:R Shiny - Trying to loop with reactive and ActionButtonR Shiny - 尝试使用响应式和 ActionButton 循环
【发布时间】:2020-07-29 06:26:39
【问题描述】:

我的闪亮应用中有 10 个操作按钮。我正在尝试创建一个循环,但我遇到了反应值的问题。我该如何解决?

这是按钮 1 的代码:

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

  value1 <- reactiveVal(0) 

   observeEvent(input$minus1, {newValue1 <- value1() - 1) 
    value1(newValue1)})

   observeEvent(input$plus1, {newValue1 <- (value1() + 1) 
    value1(newValue1)})

 output$value1 <- renderUI(actionBttn("result1", label = value1()))

  }

我试过了,但它似乎不起作用:

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

  for (i in 1:10)
  {
  paste0("value", i) <- reactiveVal(0) 

   observeEvent(input$paste0("minus",i), {paste0("newValue", i) <- (paste0("value", i,"()") - 1)
    paste0("value", i)(paste0("newValue", i))})

   observeEvent(input$paste0("plus",i), {newValue1 <- (paste0("value", i,"()") + 1) 
    paste0("value", i)(paste0("newValue", i))})

 output$paste0("value", i) <- renderUI(actionBttn(paste0("result", i), label = paste0("value", i,"()")))
  }

  }

【问题讨论】:

  • 嗨,你应该看看modules,它们降低了在输入名称之间迷路的风险,并且有助于创建循环
  • 使用lapply 以编程方式启动observeEvents,而不是for 循环。喜欢,lapply(1:10, function(i){ .......})

标签: r loops shiny reactive


【解决方案1】:

我过去曾根据以下内容制作过类似的演示:

https://community.rstudio.com/t/one-observer-to-handle-any-number-of-buttons-in-shiny/6569/2

这会产生 10 个加号和 10 个减号按钮,每个按钮都会增加或减少 reactiveValues。我希望这可能会有所帮助。

library(shiny)
library(dplyr)

ui <- fluidPage(
  fluidRow(uiOutput("show_table"))
)

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

  Data <- reactiveValues(
    Info = rep(0, 10)
  )

  observe({
    input_btn_p <- paste0("btn_p_", 1:10)
    lapply(input_btn_p, function(x){
       observeEvent(input[[x]], {
         i <- as.numeric(sub("btn_p_", "", x))
         Data$Info[i] <- Data$Info[i] + 1
       })
     })

    input_btn_m <- paste0("btn_m_", 1:10)
    lapply(input_btn_m, function(x){
      observeEvent(input[[x]], {
        i <- as.numeric(sub("btn_m_", "", x))
        Data$Info[i] <- Data$Info[i] - 1
      })
    })
  })

  display_table <- reactive({
    data.frame(value = Data$Info) %>%
      mutate(button1 = vapply(row_number(),
                             function(i){
                               actionButton(inputId = paste0("btn_p_", i), label = "Plus") %>% 
                                 as.character()
                             },
                             character(1)),
             button2 = vapply(row_number(),
                              function(i){
                                actionButton(inputId = paste0("btn_m_", i), label = "Minus") %>% 
                                  as.character()
                              },
                              character(1)))
  })

  output$show_table <- renderUI({
    display_table() %>% 
      select(value, button1, button2) %>% 
      knitr::kable(format = "html", escape = FALSE) %>% 
      HTML()
  })

}

shinyApp(ui, server)

【讨论】:

  • 非常感谢!完美运行。
猜你喜欢
  • 2020-07-07
  • 2020-10-22
  • 1970-01-01
  • 1970-01-01
  • 2019-02-15
  • 2021-11-11
  • 2017-11-13
  • 2021-02-19
  • 1970-01-01
相关资源
最近更新 更多