Попытка использовать actionButton, чтобы получить следующее случайное изображение, вложенное в случайную вкладку - PullRequest
2 голосов
/ 11 июля 2019

Проблема

Я создаю блестящее приложение с анкетой, о породах собак и жизненном пространстве.А для вопросов каждая порода собак отображается в виде вкладки в случайном порядке, и на этих вкладках я показываю различные дома, где вы можете иметь эти породы собак.

Основная идея состоит в том, чтобы рандомизировать обе породы собак (повкладка) и каждая из возможностей размещения вложена в эту вкладку.

Что у меня есть до сих пор

Это мой лучший рабочий пример на данный момент в работающем блестящем приложении ивсе файлы и скрипты находятся в этом репозитории 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])))
                           )

           })

Ожидаемое решение

Просто когда я нажимаю кнопку следующего дома, я вижу следующий случайный дом

Ответы [ 2 ]

1 голос
/ 14 июля 2019

Помимо сохранения подсчета в реактивных значениях, основной задачей было бы провести различие между вкладками: два способа приходят на ум.

  • Использование модулей
  • Прослушивание изменений на вкладках.

Для подсчета щелчков просто используйте reactiveValues().

global <- reactiveValues(nr = 1)    

observeEvent(input$New_Button1, {
  global$nr <- min(global$nr + 1, maxHouseNr)
})

Чтобы сбросить счетчик при переключении на новую вкладку, которую вы хотите прослушать при смене вкладки.Вы можете дать tabsetPanel() идентификатор и прослушать input$ID.

Установить идентификатор:

do.call(tabsetPanel, c(id = "whichTab", myTabs))

Прослушать изменение вкладки:

observeEvent(input$whichTab, {
  global$nr <- 1 
})

Код:

library(shiny)
maxHouseNr <- 3
Habitats <- 1:maxHouseNr
RandomH <-lapply(rep(maxHouseNr, 3), sample, size = maxHouseNr, replace = FALSE)


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) {


    global <- reactiveValues(nr = 1)    

    observeEvent(input$whichTab, {
      global$nr <- 1 
    })

    observeEvent(input$New_Button1, {
      global$nr <- min(global$nr + 1, maxHouseNr)
    })

    observeEvent(input$New_Button2, {
      global$nr <- min(global$nr + 1, maxHouseNr)
    })

    observeEvent(input$New_Button3, {
      global$nr <- min(global$nr + 1, maxHouseNr)
    })


    #####################################
    # Tabs breeds

    output$mytabs = renderUI({
      Breeds <- c(1:3)
      Random <- sample(Breeds, 3)
      myTabs = lapply(Random, function(i){


        tabPanel(paste("Breed", i),

                 ###
                 fluidPage(
                   fluidRow(
                     column(6,
                            wellPanel(
                              img(src = paste0("Dog",i, ".jpg"), height = 300, width = 300))),
                     renderUI({

                       column(6, actionButton(inputId = paste0("New_Button", i), "Next house"),
                              wellPanel(
                                uiOutput(paste0("PlotHouse", i)))
                       )

                     })
                   )
                 ))
        ####
      })


      do.call(tabsetPanel, c(id = "whichTab", myTabs))
    })

    output$PlotHouse1 <- renderUI({
      img(src = paste0("House", RandomH[[1]][global$nr],".jpg"), height = 300, width = 300)
    })

    output$PlotHouse2 <- renderUI({

      img(src = paste0("House", RandomH[[2]][global$nr],".jpg"), height = 300, width = 300)
    })

    output$PlotHouse3 <- renderUI({
      img(src = paste0("House", RandomH[[3]][global$nr],".jpg"), height = 300, width = 300)
    })


  }

) #cerrado de shiny
0 голосов
/ 14 июля 2019

Просто преобразуйте случайный порядок в реактивные значения и запустите расчет с помощью кнопки в реактивной среде (ojala sea esto lo que quieres)

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) {

        Breeds <- c(1:3)
        Values =reactiveValues()

        #####################################
        # Tabs breeds
        observe({
            input$New_Button
            Values$Random <- sample(Breeds, 3)
        })

        output$mytabs = renderUI({
            myTabs = lapply(Values$Random, function(i){


                tabPanel(paste("Breed", i),

                         ###
                         fluidPage(
                             fluidRow(
                                 column(6,
                                        wellPanel(
                                            img(src = paste0("Dog",i, ".jpg"), height = 300, width = 300))),
                                 renderUI({
                                     Habitats <- c(1:3)
                                     RandomH <- sample(Habitats, 3)

                                     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)
        })


    }

) #cerrado de shiny
...