如何将模块输入传递给父应用程序?

时间:2016-07-29 14:13:16

标签: r shiny

我发现这个post关于如何在模块之间传递输入,但我不知道如何将模块传递给父应用程序。

如果我有一个模块 ui1.R

ui1UI <-  function(id, label = "ui1UI") {
  ns <- NS(id)
  shinyUI(fluidPage(
    textInput(ns('id'), 'ID'),
    actionButton(ns("confirm"), "Submit", class='btn-primary')

  ))
}

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

  cond <- reactive({ input$confirm})

  observeEvent(length(input$id)!="", {
    toggleState("confirm")
  })

  return(cond)

}

我想从 server.R

访问cond
shinyServer(function(input, output, session) {

  cond <- callModule(ui1, "ui1")
  callModule(server, "ui1a", cond)

  output$page <- renderUI(expr= if(is.null(cond())) {
    ui1UI('ui1')
    } else {
    ui2UI('ui2')
    }

    )
})

如何将cond的值传递给server.R

应用程序的其余部分是:

ui.R

tagList(useShinyjs(), htmlOutput("page"))

global.R

rm(list=ls())
source('ui1.R')
source('ui2.R')
library(shiny)
library(shinyjs)

ui2.R

ui2UI <-  function(id, label = "ui2UI") {
  ns <- NS(id)
  shinyUI(fluidPage(
    textInput(ns('id'), 'Second Page')

  ))
}

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

}

最终,我希望渲染 ui1.R ,但我得到 ui2.R ,好像cond没有被收到在if()

ps:r-bloggers帖子使用callModules()。它只是callModule()的旧选择吗?

1 个答案:

答案 0 :(得分:0)

我不确定你的问题究竟是什么。你有正确的想法。下面是一个使用您的模块显示操作按钮值的示例(这有点奇怪,但无论如何):

[projects NO-HEAD]