在不指定其完整 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 小部件的所有数字的列表。
此外,应该可以多次触发动作,而不是一次。
非常感谢您的提前帮助
如果你想让每个数字输入分别反应,你实际上可以交换 lappy
和 observeEvent
的顺序。
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)
我正在使用 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 小部件的所有数字的列表。
此外,应该可以多次触发动作,而不是一次。
非常感谢您的提前帮助
如果你想让每个数字输入分别反应,你实际上可以交换 lappy
和 observeEvent
的顺序。
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)