r语言 - 观察另一个模块中的事件



我想创建一个UI模块,插入它,然后从服务器模块获取一个输入对象。然后,我想观察此输入对象上的事件。

目前,我从 callModule 返回一个输入对象作为反应值。但是,我创建的观察器只触发一次(在初始化时(。

谁能告诉我我正在尝试做的事情是否可行,以及我哪里出错了?附加代码。提前谢谢。

John

.app。R

library(shiny)
source("added.R")
source("addedUI.R")
# Define UI for application that draws a histogram
ui <- fluidPage(
    actionButton("add_id", "Add"),
    actionButton("print_id", "Print list"),
    tags$hr(),
    tags$div(id = "div"),
    tags$hr()
)
# Define server logic required to draw a histogram
server <- function(input, output) {
    id <- 0  
    rv <- list()
    next_id <- function()
    {
        id <<- id + 1
        return (as.character(id))
    }
    observeEvent(input$print_id,
                 {
                     print(rv)
                 })
    observeEvent(input$add_id,
    {
        x <- next_id()
        ui <- addedUI(x)
        insertUI(selector = sprintf("#%s", "div"), where = "beforeEnd", ui = ui)
        rv[[x]] <<- callModule(added, x)
        observeEvent(rv[[x]],
        {
            print(sprintf("Observed %s: ", x))
        })
        print(rv)
    })
}
# Run the application 
shinyApp(ui = ui, server = server)

添加。R

added <- function(input, output, session)
{
    return (reactive(input$text_id))
}

添加了UI.R

addedUI <- function(id)
{
    ns <- NS(id)
    tags$div(textInput(ns("text_id"), "Text", value = "Abc"))
}

您需要使用 observeEvent(rv[[x]](), ...) 从反应式中读取当前值。否则,您将收到对reactive对象的引用,这是不可观察的。对于print_id观察者也是如此。

library(shiny)
added <- function(input, output, session)
{
  return (reactive(input$text_id))
}
addedUI.R
addedUI <- function(id)
{
  ns <- NS(id)
  tags$div(textInput(ns("text_id"), "Text", value = "Abc"))
}
# Define UI for application that draws a histogram
ui <- fluidPage(
    actionButton("add_id", "Add"),
    actionButton("print_id", "Print list"),
    tags$hr(),
    tags$div(id = "div"),
    tags$hr()
)
# Define server logic required to draw a histogram
server <- function(input, output) {
    id <- 0  
    rv <- list()
    next_id <- function()
    {
        id <<- id + 1
        return (as.character(id))
    }
    observeEvent(input$print_id,
                 {
                     print(lapply(rv, function(x){x()}))
                 })
    observeEvent(input$add_id,
    {
        x <- next_id()
        ui <- addedUI(x)
        insertUI(selector = sprintf("#%s", "div"), where = "beforeEnd", ui = ui)
        rv[[x]] <<- callModule(added, x)
        observeEvent(rv[[x]](),
        {
            print(sprintf("Observed %s: ", x))
        })
        print(rv)
    })
}
# Run the application 
shinyApp(ui = ui, server = server)

最新更新