Как получить доступ к реактивному значению в родительском модуле?

Чего я хочу добиться, так это получить доступ к значению reactive, переданному родительскому модулю из дочернего модуля. Воспроизводимый пример ниже демонстрирует эту идею. Когда я нажимаю кнопку в mod_server_btn, ее значение должно быть напечатано в консоли (из родительского модуля):

library(shiny)
mod_ui_btn <-  function(id, label = "ui1UI") {
    ns <- NS(id)
    shinyUI(fluidPage(
        actionButton(ns("confirm"), "Submit", class='btn-primary')
    ))
}

mod_server_btn <- function(input, output, session) {   
    cond <- reactive({ input$confirm})
    return(cond)    
}

ui =fluidPage(
    mod_ui_btn("test"),
    uiOutput("example")
)

server=shinyServer(function(input, output, session) {   
    value <- callModule(mod_server_btn,"test")
    print(value)
    #print(value$cond) # these 3 don't work either
    #print(value()$cond)
    #print(value())  
})

shinyApp(ui=ui,server=server)

Однако это не работает. Когда я нажимаю кнопку, я получаю текст: reactive({input$confirm}) в консоли, и это не то, что я хочу, мне нужно получить доступ к значению кнопки. Общий вопрос - возможно ли вообще получить доступ к реактивному значению в родительском модуле?

EDIT: @rbasa, @YBS спасибо за ваши ответы. На самом деле в моем реальном приложении мне нужно вернуть более одного реактивного значения в родительский модуль. Ниже немного измененный код - я добавил вторую кнопку в mod_ui_btn - теперь мне нужно вернуть значения с обеих кнопок в модуль server. Я составил список reactives, но не могу получить к ним доступ с помощью observe или output$example <-:

library(shiny)
mod_ui_btn <-  function(id, label = "ui1UI") {
    ns <- NS(id)
    shinyUI(fluidPage(
        actionButton(ns("confirm"), "Submit", class='btn-primary'),
        actionButton(ns("confirm2"), "Submit2", class='btn-primary')
    ))
}

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

    return(
        list(
            cond = reactive({ input$confirm}),
            cond2 = reactive({ input$confirm2})
        )
    )   
}

ui =fluidPage(
    mod_ui_btn("test"),
    verbatimTextOutput("example"),
    verbatimTextOutput("example2")
)

server=shinyServer(function(input, output, session) {   
    value <- callModule(mod_server_btn,"test")  
    output$example <- renderPrint(value$cond)
    output$example2 <- renderPrint(value$cond2)
    
    observe({
        print(value$cond)  #this is how I usually catch reactives - by their name
        print(value$cond2)
    })
})

shinyApp(ui=ui,server=server)

Обычно я использую return(list(..some reactive values)), чтобы вернуть более одного активного значения в другой модуль, а затем поймать их, используя их имена в родительском модуле. Здесь это не работает, даже если я использую наблюдение. Значение не возвращается.


person mustafa00    schedule 16.07.2021    source источник
comment
Привет, проверьте stackoverflow.com/questions/48882427/   -  person gdevaux    schedule 16.07.2021
comment
спасибо за ссылку!   -  person mustafa00    schedule 16.07.2021


Ответы (1)


Вы можете получить доступ с помощью value(). Я бы порекомендовал изменить ваш mod_server_btn на тот, который показан ниже, и обратите внимание на вызов в server. EDIT: обновлено несколько переменных. Попробуй это

library(shiny)
mod_ui_btn <-  function(id, label = "ui1UI") {
  ns <- NS(id)
  shinyUI(fluidPage(
    actionButton(ns("confirm"), "Submit", class='btn-primary'),
    actionButton(ns("confirm2"), "Submit2", class='btn-primary')
  ))
}

mod_server_btn <- function(id) {
  moduleServer(id, function(input, output, session) {
    return(
      list(
        cond = reactive(input$confirm),
        cond2 = reactive(input$confirm2)
      )
    )  
    
  })
}

ui =fluidPage(
  mod_ui_btn("test"),
  verbatimTextOutput("example"),
  verbatimTextOutput("example2")
)

server=shinyServer(function(input, output, session) {   
  # value <- callModule(mod_server_btn,"test")  
  value <- mod_server_btn("test")
  output$example <- renderPrint(value$cond())
  output$example2 <- renderPrint(value$cond2())
  
  observe({
    print(value$cond())  #this is how I usually catch reactives - by their name
    print(value$cond2())
  })
})

shinyApp(ui=ui,server=server)
person YBS    schedule 16.07.2021
comment
Чтобы добавить: поскольку value, возвращаемый mod_server_btn, является реактивной переменной, ее следует вызывать из реактивного контекста (observe, reactive и т. д.). - person rbasa; 16.07.2021
comment
Итак, еще один вопрос - как это вызвать в контексте reactive? Я пытался поймать value() в serve модуле: btn <- reactive({ value() }) print(btn()). К сожалению, я получил ошибку: Operation not allowed without an active reactive context - person mustafa00; 16.07.2021
comment
Как указано @rbasa в его комментарии, вы можете вызывать реактивные переменные (value(), input$myvar и т. д.) только в активном реактивном контексте, например, observe(...), observeEvent(...), output$myout <- renderXXX(...), reactive(...) и т. д.. Чтобы напечатать его на консоли, вызов внутри observer, как я сделал в своем коде. Я не уверен, почему вы определяете btn <- reactive({ value() }), поскольку value() является реактивным. - person YBS; 16.07.2021
comment
Хорошо, спасибо. Последний - мне нужно вернуть более одного реактивного значения в родительский модуль. Вот как это работает в моем реальном приложении. Поэтому я возвращаю их в list, а затем ловлю в observe, но это не работает. Я добавил РЕДАКТИРОВАТЬ в свой первый пост с примером, не могли бы вы взглянуть, пожалуйста - person mustafa00; 16.07.2021
comment
Попробуйте value$cond(). Меня устраивает. - person YBS; 16.07.2021