RShiny Создание выпадающего меню для графических диаграмм - использование подэлементов

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

Графики расположены во втором подэлементе каждого элемента списка.

e.g. list = ([[dataframe1, plot1], [dataframe2, plot2], etc])

Приложение, которое я пытаюсь создать, предоставлено:

choices = paste0("list[[1]][[", 1:2, "]]")

ui <- shinyUI(fluidPage(selectInput("selectPlot", 
                                    "Choose desired country", 
                                     choices),
                        plotlyOutput("plot")))

server <- shinyServer(function(input,output){      
   output$plot <- renderPlotly({
     return(get(input$selectPlot))
   })
 })

shinyApp(ui,server)

Однако графики не отображаются, и я получаю следующую ошибку: ** Предупреждение: ошибка в get: объект 'anom [[1]] [[1]]' не найден *

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

Добавление воспроизводимого примера:

ds1 <- data.frame(sample(1:10, 10), sample(11:20, 10))
ds2 <- data.frame(sample(1:10, 10), sample(11:20, 10))

p1 = plot_ly(x = ~ds1[[1]], y = ~ds1[[2]]) %>% add_markers() 
p2 = plot_ly(x = ~ds2[[1]], y = ~ds2[[2]]) %>% add_markers() 

l = list(list(ds1, p1), list(ds2, p2))

#want to access p1 and p2 from within the list to create drop down menu graph
choices.p = paste0("l[[1]][[", 1:2, "]]")

ui <- shinyUI(fluidPage(selectInput("selectPlot", 
                               "Choose desired country", 
                               choices.p), 
                               plotlyOutput("plot")))


server <- shinyServer(function(input,output){      
output$plot <- renderPlotly({
  return(get(input$selectPlot)) 
 })
})

shinyApp(ui,server)

person Mike Tauber    schedule 15.02.2018    source источник
comment
сюжетно! Вот воспроизводимый пример - (stackoverflow.com / questions / 45255613 /) - вместо сохранения графиков в глобальной среде - есть ли способ получить к ним доступ из списка, который уже сохранен в среде?   -  person Mike Tauber    schedule 15.02.2018
comment
@MikeTauber Даже в вашем случае, если он у вас сохранен в списке, не так ли? Без сохранения в глобальную переменную означает, что вы просто хотите, чтобы график отображался только тогда, когда требуется, а не сохраняется, верно?   -  person amrrs    schedule 15.02.2018
comment
@MikeTauber Пожалуйста, проверьте ответ и обратную связь   -  person amrrs    schedule 15.02.2018
comment
@amrrs спасибо за ваши комментарии. Очень признателен. Я добавил воспроизводимый пример - помогает ли это объяснить проблему?   -  person Mike Tauber    schedule 15.02.2018


Ответы (2)


Что-то вроде этого сработает для вас:

p1 <- plot_ly(mtcars, x=~cyl, y=~gear)
p2 <- plot_ly(iris, x=~Sepal.Width, y=~Petal.Length, color = "red")

l = list(mtcars = list(mtcars, p1), iris = list(iris, p2))
choice_data <- names(l)

ui <- shinyUI(fluidPage(selectInput("selectPlot", 
                                    "Choose desired country", 
                                    choices = choice_data), textOutput("selected_var"), uiOutput("test")))


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

  output$test <- renderUI({
    l[[input$selectPlot]][2]

  })

})

shinyApp(ui,server)
person MLavoie    schedule 15.02.2018

На основе вашего MWE этот код нигде не сохраняет графики, а использует observeEvent для построения графика на основе выбора.

library(shiny)
library(plotly)



ui <-shinyUI(fluidPage(selectInput("selectPlot", "Choose desired plot", choices=paste0("p", 1:2)), plotlyOutput("plot")))

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

  observeEvent(input$selectPlot,{
    if(input$selectPlot %in% 'p1') output$plot <- renderPlotly(plot_ly(mtcars, x=~cyl, y=~gear))
    else output$plot <- renderPlotly(plot_ly(mtcars, x=~hp, y=~am))

  })


})

shinyApp(ui,server)
person amrrs    schedule 15.02.2018
comment
Спасибо за ответ @amrrs, очень признателен. К сожалению, все равно не повезло. Если я использую ваш пример выше (этот пример stackoverflow.com/questions/45255613/) - предположим, что p1 и p2 содержатся в списке - например, список = ((набор данных1, p1), (набор данных2, p2)). Как бы вы могли получить доступ к этим подэлементам из рабочей области, чтобы они отображались в раскрывающемся меню? В частности, как вы: 1) ссылаетесь на них в аргументе «выбор» пользовательского интерфейса и 2) обращаетесь к ним на сервере Shiny с помощью input $ selectPlot? Сообщите мне, если что-то из этого все еще неясно! - person Mike Tauber; 15.02.2018