Как сделать изображения кликабельными для отображения подмножества Dataframe? (R Shiny) - PullRequest
2 голосов
/ 16 февраля 2020

Здравствуйте, я новичок в RShiny и пытаюсь создать приложение для проекта.

У меня есть 5 изображений в пользовательском интерфейсе. Я хотел бы сделать их кликабельными: когда вы нажимаете на изображение, оно отображает подмножество фрейма данных в главной панели.

Мой Dataframe содержит столбец под названием «Настроение», и в нем есть 5 настроений («Вечеринка и танцы», «Рэп», «Веселые флюиды», «Sunday Chillout» и «Roadtrip musi c») , Каждое изображение должно отображать ряды одного из настроений.

Это код, который я использовал сейчас:

UI.R


shinyUI(

  fluidPage(  useShinyjs(), 

             headerPanel(
               h1(img(src="logo.png",height  = 70, width = 70),"Quelle est votre humeur du moment ?",
                  style = "font-weight: 500; color: #FFFFFF;")),

   dashboardSidebar(
     fluidRow(
       column(width=11.9, align="center",
              selectInput("Mood", label= "Choose your Mood : ", 
                             choices = test$Mood),
                 img(id="my_img1",src="party.jfif",width="19.5%",style="cursor:pointer;"),
                 img(id="my_img2",src="cluster 2.jpg",width="19.5%",style="cursor:pointer;"),
                 img(id="my_img3",src="roadtrip.jpg",width="19.5%",style="cursor:pointer;"),
                 img(id="my_img4",src="rap.jfif",width="19.5%",style="cursor:pointer;"),
                 img(id="my_img5",src="sunday.jpg",width="19.5%",style="cursor:pointer;")),

 column(11.2, align="center",
      mainPanel(br(),br(),DT::dataTableOutput("dynamic"), width = "100%"))
 )))) 

Server.R

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


shinyServer(function(input,output){

  output$dynamic<- DT::renderDataTable({

  data <- DT::datatable(test[test$Mood ==input$Mood, c("Song","Artist","Mood","Listen to song"), drop = FALSE], escape = FALSE)
  data   

  })
})

Я перепробовал множество комбинаций, но все они провалились, потому что у меня нет базовых c навыков работы Shiny js.

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

shinyServer(function(input,output){
 onclick("my_img1",     { print(datatable(test[test$Mood =="Party and dance", c("Song","Artist","Mood","Listen to song"), drop = FALSE], escape = FALSE))})

})

Любая обратная связь будет принята с благодарностью !! Спасибо !

Вот так выглядит мой интерфейс

1 Ответ

1 голос
/ 25 февраля 2020

Прошло много времени с тех пор, как я использовал Shiny, поэтому я могу быть немного ржавым. Но вот возможный подход к решению вашей проблемы: вы можете использовать reactiveValue, чтобы отслеживать, какое настроение выбрано, и обновлять эту переменную при каждом нажатии на одно из изображений. Затем используйте это reactiveValue в подмножестве вашего dataframe, как показано ниже. Надеюсь, это поможет!

library(shiny)
library(shinyjs)

df = data.frame(mood = c('mood1','mood1','mood1','mood2','mood2','mood2'), 
                example = c('dog',' cat','bunny','elephant','t-rex','not dog'))

ui <- shinyUI(

  fluidPage(  
    useShinyjs(), 
    img(id="my_img1",src="img1.png",width="19.5%",style="cursor:pointer;"),
    img(id="my_img2",src="img1.png",width="19.5%",style="cursor:pointer;"),
    DT::dataTableOutput("dynamic")
  )
)

server <- shinyServer(function(input,output){


  selected_mood <- reactiveVal()
  shinyjs::onclick("my_img1",  selected_mood('mood1'))
  shinyjs::onclick("my_img2",  selected_mood('mood2'))
  output$dynamic<- DT::renderDataTable({  
    req(selected_mood())
    df[df$mood == selected_mood(),]
  })
})

shinyApp(ui, server)
...