shiny: renderUI и shiny: uioutput для создания нового menuItem и нового вывода, но tabItem не отображается

Я хочу создать новый menuItem и новый plotOutput на основе actionButton, и только что отрендеренный plotOutput будет отображать график на основе отправленного значения. Я успешно сгенерировал элемент menuItem и виджет numericInput с отправленным значением, но график и соответствующий tabItem не отображаются.
Вот рабочий процесс:

submit - ›рендеринг menuItem с входным объектом и plotOutput -› plotOutput будет отображаться на основе визуализированного входного объекта

Вторая процедура прошла успешно, но все остальное не работает, код приведен ниже:

library(shiny)
library(shinydashboard)

## ============================================ Define ui ==================================================

header1 <- dashboardHeader(
  title = "My Dynamic Menu"
) #dashboardHeader

# DYNAMIC UI
sidebar1 <- dashboardSidebar(
  sidebarMenu(
    menuItem('aa',tabName = 'aa')
  ) ,
  sidebarMenuOutput('bb')
) #dashboardSidebar
#
body1 <- dashboardBody(
  tabItems(
    tabItem(tabName = 'aa',
            numericInput('num_input', 'number', value = 5), 
            actionButton('submit','Submit')),
    tabItem(tabName = "main", uiOutput('eee')) # put a tabItem here
  ) #tabItems
) #dashboardBody

ui <- dashboardPage(header1, sidebar1, body1)

server <- function(input, output, session) {
  dt<-eventReactive(input$submit, {
    input$num_input * 5
  })
  
  observeEvent(input$submit, {
    output$bb<-renderMenu({
      sidebarMenu(
        menuItem("Main", tabName = "main", 
                 numericInput('ddd', 'input value', value = dt()),
                 numericInput('ggg', 'another input', value=dt()+5))
      )
    })
    
    output$eee<-renderUI({
      fluidRow(
        p('hello'),
        plotOutput('fff')
      )
    })
  })
  
  
   observeEvent({
     input$ddd
     input$ggg
   },{
       output$fff<-renderPlot({
       plot(1:input$ddd, main=as.character(input$ggg))
     })
   })
  
} #server
## ============================================ Run application ============================================
shinyApp(ui, server)

Большое спасибо, если эта проблема решена.


person Ron Lee    schedule 28.09.2020    source источник


Ответы (1)


чтобы быть связанным с tabItem, menuItem должен содержать только menuSubItem. Если вы удалите два числовых входа (ddd и ggg), то главная страница активируется при нажатии на вновь созданный элемент главного меню. Смешивать навигацию и ввод - не лучшая идея.

Вам лучше переместить свои входы в свой основной tabItem или поместить их на отдельную панель (не в меню) на боковой панели.

добавлен uiOutput для входов в ui

# DYNAMIC UI
sidebar1 <- dashboardSidebar(
  sidebarMenu(
    menuItem('aa',tabName = 'aa')
  ) ,
  sidebarMenuOutput('bb'),
  uiOutput("inputs")
) #dashboardSidebar

добавлен renderUI для этого вывода на сервере

output$inputs <- renderUI(tagList(
      numericInput('ddd', 'input value', value = dt()),
      numericInput('ggg', 'another input', value=dt()+5)
    ))

и удалили входные данные из вашего renderMenu

output$bb<-renderMenu({
      message("bb")
      sidebarMenu(
        menuItem("Main", tabName = "main")
      )
    })

Вы должны вручную перейти на главную страницу, чтобы отобразить график

person Billy34    schedule 28.09.2020
comment
Спасибо за ваше решение, и я нашел этот пост, и он поможет решить эту проблему, stackoverflow.com/questions/50245925/ - person Ron Lee; 28.09.2020
comment
Ага, хороший момент. Я имел в виду нечто подобное. Рад, что это помогло тебе - person Billy34; 28.09.2020