Если вы хотите, чтобы каждый ввод numeri c реагировал отдельно, вы можете поменять местами 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)
Более современный подход к этому типу реализации будет быть использовать блестящую модульную структуру ( Официальная страница ).
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)