在不指定其完整 inputID 的情况下使用通用闪亮小部件在 R shiny 中触发操作

Trigger action in R shiny with a generic shiny widgets without specifying its complete inputID

我正在使用 insertUI 函数在服务器端创建一些 numericInput 小部件,将这些对象中的每一个命名为“num_input_x”,其中 x 从 1 到任何值(总数可以根据某些条件增加或减少由用户在会话期间设置)。

现在我希望这些动态创建的 numericInput 中的每一个都触发相同的操作。

问题是,据我所知,对于 observeEvent 或 observe,您需要指定被观察并触发该操作的确切 inputID 名称。

为了简单起见,我需要这样的东西:

observeEvent(input[["num_input_*"]], {#action here})

或者这个:

observeEvent(lapply(listX,function(n) input[[paste0("num_input_",n)]]), {#action here})

其中 * 代表任何字符,listX 代表包含用于命名 numericInput 小部件的所有数字的列表。

此外,应该可以多次触发动作,而不是一次。

非常感谢您的提前帮助

如果你想让每个数字输入分别反应,你实际上可以交换 lappyobserveEvent 的顺序。

library(shiny)

make_num_input <- function(id) {
  numericInput(paste0("num_inp_", id), "number", 0, 0, 10)
}


ui <- fluidPage(
  lapply(as.character(1:3), make_num_input)
)

server <- function(input, output, session) {
  lapply(as.character(1:3), function(id) {
    name <- paste0("num_inp_", id)
    observeEvent(input[[name]], {
      msg <- sprintf("%s is now %d\n", id, input[[name]])
      cat(msg)  
    })    
  })
}

shinyApp(ui=ui, server=server)

此类实现的更现代方法是使用闪亮的模块框架 (Official page)。

library(shiny)

make_num_input <- function(id) {
  ns <- NS(id)
  numericInput(ns("num_inp"), "number", 0, 0, 10)
}

module <- function(id) {
  moduleServer(id, function(input, output, session) {
    observeEvent(input$num_inp, {
      msg <- sprintf("%s is now %d\n", id, input$num_inp)
      cat(msg)  
    })
  })
}

ui <- fluidPage(
    lapply(as.character(1:3), make_num_input)
)

server <- function(input, output, session) {
  lapply(as.character(1:3), module)  
}

shinyApp(ui=ui, server=server)