#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()