Как избежать самых больших двусмысленностей с записями навбарМену, имеющими одинаковые имена?

#r #shiny #automated-tests #shinytest

Вопрос:

Это мой очень простой блестящий app.R . Как вы видите, под двумя верхними пунктами меню есть пункты подменю с одинаковыми именами:

 library(shiny)
ui <- basicPage(
  navbarPage("App", id = "nav",
    navbarMenu("Top 1", # id = "top1",
      tabPanel("Sub 1", "Top 1, Sub 1"),
      tabPanel("Sub 2", "Top 1, Sub 2")
    ),
    navbarMenu("Top 2", # id = "top2",
      tabPanel("Sub 1", "Top 2, Sub 1"),
      tabPanel("Sub 2", "Top 2, Sub 2")
    )
  )
)
server <- function(input, output, session) {}
shinyApp(ui = ui, server = server)
 

Я могу запустить это приложение и получить доступ ко всем записям подменю просто отлично, используя shiny::shinyAppDir(".") .

Однако при записи тестов, проходящих через все вкладки с помощью shinytest::recordTest(".") , записанный сценарий выглядит примерно так:

 app <- ShinyDriver$new("../../")
app$snapshotInit("mytest")

app$setInputs(nav = "Sub 2")
app$setInputs(nav = "Sub 1")
app$setInputs(nav = "Sub 2")
app$snapshot()
 

Вы сразу видите проблему: из звонков неясно, какой из пунктов верхнего меню я выбрал (для записи я выбрал Top 1, Top 2, Top 2).

Как я могу справиться с этим, не переименовав пункты подменю? Я попытался добавить an id к navbarMenu s, как вы можете видеть выше, но это привело только к

Все вкладки должны быть аргументами без имени, но некоторые имеют имена: id

Ответ №1:

Покопавшись немного, я нашел это:

значение Значение, которое следует отправлять при tabsetPanel сообщениях о том, что выбрана эта вкладка. Если опущено и tabsetPanel имеет id значение «а», то будет использоваться заголовок.

https://shiny.rstudio.com/reference/shiny/0.14/tabPanel.html

Таким образом, одним из решений является:

 library(shiny)
ui <- basicPage(
  navbarPage("App", id = "nav",
    navbarMenu("Top 1",
      tabPanel("Sub 1", "Top 1, Sub 1", value = "top1/sub1"),
      tabPanel("Sub 2", "Top 1, Sub 2", value = "top1/sub2")
    ),
    navbarMenu("Top 2",
      tabPanel("Sub 1", "Top 2, Sub 1", value = "top2/sub1"),
      tabPanel("Sub 2", "Top 2, Sub 2", value = "top2/sub2")
    )
  )
)
server <- function(input, output, session) {}
shinyApp(ui = ui, server = server)
 

что дает

 app <- ShinyDriver$new("../../")
app$snapshotInit("mytest")

app$setInputs(nav = "top1/sub2")
app$setInputs(nav = "top2/sub1")
app$setInputs(nav = "top2/sub2")
app$snapshot()