2017-10-05 3 views
1

私はadd/removeBtnモジュールを使って "最初の"モジュールからUIを追加したり削除したりする単純なおもちゃの例を持っています。私は追加/削除がクリックされた回数を追跡する必要があります。モジュールを使用しない場合は簡単ですが、ネストされたモジュールのコンテキストでこれを実行しようとしています。コードは以下の通りですが、基本的には、メインサーバー機能のaddRmBtnServer()からの戻り値にアクセスできないようです。私はそれが簡単な修正であると確信していますが、私はこれを中心に多くの方法を試しましたが、addRmBtnServer()の呼び出し結果にアクセスできないようです。ありがとう!R Shiny:光沢のあるモジュールからリアクティブ値をマスターサーバーの機能に戻すにはどうすればいいですか?

library(shiny) 

firstUI <- function(id) { uiOutput(NS(id, "first")) } 

firstServer <- function(input, output, session, a) { 

    output$first <- renderUI({ 
     selectInput(session$ns("select"), h4("Select"), paste0(isolate(a()),letters[1:4])) 
    }) 
} 

removeFirstUI <- function(id) { 
    removeUI(selector = paste0('#', NS(id, "first"))) 
} 

addRmBtnUI <- function(id) { 
    ns <- NS(id) 

    tags$div(
    actionButton(inputId = ns('insertParamBtn'), label = "Add"), 
    actionButton(ns('removeParamBtn'), label = "Remove"), 
    hr(), 
    tags$div(id = ns('placeholder')) 
) 
} 

addRmBtnServer <- function(input, output, session, moduleToReplicate, ...) { 
    ns = session$ns 

    params <- reactiveValues(btn = 0) 

    observeEvent(input$insertParamBtn, { 
     params$btn <- params$btn + 1 

     callModule(moduleToReplicate$server, id = params$btn, ...) 
     insertUI(
       selector = paste0('#', ns('placeholder')), 
       ui = moduleToReplicate$ui(ns(params$btn)) 
       ) 
    }) 

    observeEvent(input$removeParamBtn, { 
     moduleToReplicate$remover(ns(params$btn)) 
     params$btn <- params$btn - 1 
    }) 

    return(params$btn) 
} 

ui <- fluidPage(
      addRmBtnUI("addRm"), 
      textInput("a", label = "a", value = 1, width = '150px'), 
      verbatimTextOutput("view", placeholder = TRUE) 
     ) 

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

    pars <- callModule(
    addRmBtnServer, id = "addRm", 
    moduleToReplicate = list(
     ui = firstUI, 
     server = firstServer, 
     remover = removeFirstUI 
     ), 
    ) 

    output$view <- renderText({ pars() }) 

} 

shinyApp(ui = ui, server = server) 
+0

サーバ関数の戻り値を使用して、観測値(入力値)を渡すことができます。最初に 'fisrtServer'から' addRmBtnServer'へ、 'addRmBtnServer'から' server'へ渡します。私の答え[ここ](https://stackoverflow.com/questions/46555355/passing-data-within-shiny-modules-from-module-1-to-module-2/46555851#46555851)を参照してください。 –

答えて

1

コメントに記載されているように、値は対応するサーバー関数の戻り値として渡すことができます。以下に実例があります。 firstUI,firstServerおよびremoveFirstUIの実装は、問題には関係しないため、除外しました。

library(shiny) 

addRmBtnUI <- function(id) { 
    ns <- NS(id) 

    tags$div(
    actionButton(inputId = ns('insertParamBtn'), label = "Add"), 
    actionButton(ns('removeParamBtn'), label = "Remove"), 
    hr(), 
    tags$div(id = ns('placeholder')) 
) 
} 

addRmBtnServer <- function(input, output, session, moduleToReplicate, ...) { 
    ns = session$ns 

    params <- reactiveValues(btn = 0) 

    observeEvent(input$insertParamBtn, { 
    params$btn <- params$btn + 1 

    callModule(moduleToReplicate$server, id = params$btn, ...) 
    insertUI(
     selector = paste0('#', ns('placeholder')), 
     ui = moduleToReplicate$ui(ns(params$btn)) 
    ) 
    }) 

    observeEvent(input$removeParamBtn, { 
    moduleToReplicate$remover(ns(params$btn)) 
    params$btn <- params$btn - 1 
    }) 

    return(reactive({params$btn})) 
} 

ui <- fluidPage(
    addRmBtnUI("addRm"), 
    verbatimTextOutput("view", placeholder = TRUE) 
) 

server <- function(input, output, session) { 
    a <- reactive({input$a}) 

    pars <- callModule(
    addRmBtnServer, id = "addRm", 
    moduleToReplicate = list(
     ui = function(...){}, 
     server = function(...){}, 
     remover = function(...){} 
    ) 
) 
    output$view <- renderText({ pars() }) 
} 

shinyApp(ui = ui, server = server) 
関連する問題