Общий ввод для различных модулей в shiny

#r #shiny #module

Вопрос:

У меня есть пользовательский интерфейс и серверный модуль в shiny, как в примере «Освоение Shiny» Хэдли Уикхема:

 histogramUI lt;-   function(id){  tagList(  selectInput(NS(id, "var"), "Variable", choices = names(mtcars)),  numericInput(NS(id, "bins"), "bins", value = 10, min = 1),  plotOutput(NS(id, "hist"))  ) }   histogramServer lt;-   function(id){  moduleServer(id, function(input, output, session){  data lt;- reactive(mtcars[[input$var]])  output$hist lt;- renderPlot({  hist(data(), breaks = input$bins, main = input$var)  }, res = 96)  })  }  

Теперь я хочу создать приложение с двумя входами и выходами, названными "hist1" и "hist2" .

Это прекрасно работает со следующим кодом:

 histogrammApp lt;-   function(){  ui lt;- fluidPage(  histogramUI("hist1"),  histogramUI("hist2")  )  server lt;- function(input, output, session){  histogramServer("hist1")  histogramServer("hist2")  }  shinyApp(ui, server)  }  

Каждый участок имеет свои собственные входные параметры.

Допустим, я хочу bins вместо этого иметь общий ввод, чтобы на обоих участках было одинаковое количество разрывов в a numericInput . Как я мог этого достичь?

Моей первой попыткой было удалить линию numericInput(NS(id, "bins"), "bins", value = 10, min = 1), и поместить линию tagList(numericInput("bins", "bins", value = 10, min = 1)), перед линией histogramUI("hist1"), , но это не сработало. Я получаю следующую ошибку: Invalid breakpoints produced by 'breaks(x)': NULL . input$bins так оно и есть NULL , я думаю. Я думаю, потому что он находится в другом пространстве имен? Как я мог решить эту проблему?

Ответ №1:

Вам следует подумать о передаче в input$bins качестве ответа на histogramServer("hist1",reactive(input$bins)) . Попробуй это

 histogramUI lt;- function(id){  tagList(  selectInput(NS(id, "var"), "Variable", choices = names(mtcars)),  #numericInput(NS(id, "bins"), "bins", value = 10, min = 1),  plotOutput(NS(id, "hist"))  )  }   histogramServer lt;- function(id,bins){  moduleServer(id, function(input, output, session){  data lt;- reactive(mtcars[[input$var]])  output$hist lt;- renderPlot({  hist(data(), breaks = bins(), main = input$var)  }, res = 96)  })  }  #histogrammApp lt;- function(){  ui lt;- fluidPage(  numericInput("bins", "Bins", value = 10, min = 1),  histogramUI("hist1"),  histogramUI("hist2")  )  server lt;- function(input, output, session){  histogramServer("hist1",reactive(input$bins))  histogramServer("hist2",reactive(input$bins))  }  shinyApp(ui, server) # } #  # histogrammApp()