Проблема
Я создаю блестящее приложение с анкетой, о породах собак и жизненном пространстве.А для вопросов каждая порода собак отображается в виде вкладки в случайном порядке, и на этих вкладках я показываю различные дома, где вы можете иметь эти породы собак.
Основная идея состоит в том, чтобы рандомизировать обе породы собак (повкладка) и каждая из возможностей размещения вложена в эту вкладку.
Что у меня есть до сих пор
Это мой лучший рабочий пример на данный момент в работающем блестящем приложении ивсе файлы и скрипты находятся в этом репозитории github , поэтому вы можете клонировать его, чтобы протестировать весь пример кода
В этом приложении вкладки отображаются в случайном порядке (по породам).Первый вариант дома также хорошо виден, моя идея состоит в том, что когда вы нажимаете кнопку действия следующий дом , он показывает следующий случайный дом без повторения (важно, чтобы отвечающий не видел следующий дом заранее дляна них это не должно влиять)
Я пробовал два разных подхода к этой проблеме, включенных в репозиторий github в папках FirstTry и SecondTry .
Первая попытка
Это работающее блестящее приложение, вот код для него, работающий по этой ссылке и с кодом по этой ссылке
Вот код действительно простого пользовательского интерфейса, просто вкладка с uiOutput mytabs , которая содержит все вкладки:
library(shiny)
shinyApp(
ui = tagList(
navbarPage("",
tabPanel("DogImages",
fluidRow(
column(width = 6,
uiOutput('mytabs')
) )
)#cerrado tab panel 2
) #cerrado de navbar Panel
), #cerrado ui
Тогда сервер - это где всемагия случается
server <- function(input, output) {
#####################################
# Tabs breeds
## This renderUI generates each tab with a lapply
output$mytabs = renderUI({
## I have three breeds
Breeds <- c(1:3)
## And then create a random order of them
Random <- sample(Breeds, 3)
#### And now loop through each random breed
myTabs = lapply(Random, function(i){
### Starts with the first random breed
tabPanel(paste("Breed", i),
###
fluidPage(
fluidRow(
column(6,
wellPanel(
###Here it sources random breed i
img(src = paste0("Dog",i, ".jpg"), height = 300, width = 300))),
##then within that I want to have the
##Random houses but here is where I run
##into problems
renderUI({
##Starting with random habitats
Habitats <- c(1:3)
RandomH <- sample(Habitats, 3)
## The idea is that I use this new button to show the next house
column(6,actionButton("New_Button", "Next house"),
wellPanel(
uiOutput(paste0("PlotHouse",RandomH[1]))) )
})
)
))
####
})
do.call(tabsetPanel, myTabs)
})
, и это просто источник каждого дома и закрытия сервера и блестящий:
output$PlotHouse1 <- renderUI({
img(src = "House1.jpg", height = 300, width = 300)
})
output$PlotHouse2 <- renderUI({
img(src = "House2.jpg", height = 300, width = 300)
})
output$PlotHouse3 <- renderUI({
img(src = "House3.jpg", height = 300, width = 300)
})
}
) #Close shiny app
Так что это работает для пород собак, но не для не, иЯ должен мнажмите кнопку next , чтобы показать следующий случайный дом, что я и пытаюсь сделать в папке SecondTry
Вторая попытка
для этогоодин я изменяю код во втором renderUI внутри lapply:
renderUI({Habitats <- c(1:3)
RandomH <- sample(Habitats, 3)
### Here I add the reactive value j = 1 to move the RandomH along
Values <- reactiveValues(j = 1)
###This is to show j just for the question
output$Numb <- renderText(Values$j)
### Here I state that every time I press new button it adds 1 to j
observe({input$New_Button
isolate(Values$j <- Values$j + 1)
})
## and this is the action button for next house
column(6,actionButton("New_Button", "Next house"),
textOutput("Numb"),
## Here I say show me img PlotHouse[j]
wellPanel(uiOutput(paste0("PlotHouse",RandomH[Values$j])))
)
})
Ожидаемое решение
Просто когда я нажимаю кнопку следующего дома, я вижу следующий случайный дом