如何在闪亮模块中创建一个依赖于来自同一模块的另一个UI的renderUI

时间:2016-09-12 13:37:37

标签: r module shiny

我已经尝试了很多这样的组合无济于事,而且完全没有想法。

我有一个data.table,DT和一个闪亮的应用程序,其中两个selectInput都基于相同的闪亮模块。 第一个inputSelect应该基于第一列对我的data.table进行子集化,第二个inputSelect将根据第二列的值进一步获取剩余的子集和子集DT。

我发现第二个selectInput的选择不可能是第一个selectInput == col1的子集后第二列的值。

我在下方提供了该应用的示例代码。我正在制作的实际应用程序比这更复杂。一切正常,直到第二个selectInput。我在使第二个renderUI反应时遇到问题。 非常欣赏正确方向的一些提示。

library(data.table)
library(shiny)

myUI <- function(id) {
  ns <- NS(id)
  fluidRow(
    uiOutput(ns('myFinalText'))
  )
}

ui <- pageWithSidebar(headerPanel = headerPanel(title = "title"),
  sidebarPanel = sidebarPanel(
                    myUI('menu1')
                  ,
                    myUI('menu2')
                  ),
    mainPanel = mainPanel(actionButton("debug","INSPECT"))
  )

set.seed(1)
DT <- data.table(col1 = LETTERS[rep(1:2, each = 3)] , 
                 col2 = LETTERS[sample(1:4, 6, replace = TRUE)],
                 num = 1:6,
                 key = c("col1", "col2"))


myTextFunc <- function(input, output, session, text) {
  output$myFinalText <- renderUI({

    if(text == "textArg1"){
    selectInput(paste0(text,"Val"),"choose",choices = DT[,col1])
    }else{
    selectInput(paste0(text,"Val"),"choose",choices = DT[col1 == input$textArg1Val,col2])
    }

  })
}

server <- function(input, output, session) {
  callModule(myTextFunc, 'menu1', session = session, 'textArg1')
  callModule(myTextFunc, 'menu2', session = session, 'textArg2')
  observeEvent(input$debug,
               browser()
               )
}

shinyApp(ui = ui, server = server)

1 个答案:

答案 0 :(得分:1)

您可以手动添加一些反应数据

喜欢

myTextFunc <- function(input, output, session, text,data) {
  output$myFinalText <- renderUI({
    if(text == "textArg1"){
      selectInput(paste0(text,"Val"),"choose",choices = DT[,col1])
    }else{
      selectInput(paste0(text,"Val"),"choose",choices = DT[col1 == data(),col2])
    }

  })
}

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

  reactive_choose=reactive({
    input$textArg1Val
  })
  callModule(myTextFunc, 'menu1',  'textArg1')

    callModule(myTextFunc, 'menu2',  'textArg2',reactive_choose)



}