Как связать пользовательский ввод с графиком gganimate в R Shiny?

Есть ли способ связать пользовательский ввод (ось x, ось y, цвет и т. д.) с графиком gganimate в R Shiny? Таким образом, когда пользователь выбирает другой ввод (ось X, ось Y, цвет и т. д.) из раскрывающегося списка. График gganimate будет заполнен разными осями x, y, цветом и т. д., чтобы его можно было изменить соответствующим образом?

Кодирование, которое я пробовал, показано ниже. И есть ошибка из-за того, что имя переменной, которое я сохранил в пользовательском интерфейсе (xValue, yValue, colorValue и т. д., которые помещаются в функцию ggplot), не применяется в Serve... enter image description here

Идея кода пользовательского интерфейса взята отсюда: https://shiny.rstudio.com/articles/layout-guide.html И это будет отображать что-то вроде этого:

enter image description here

library(shiny)
library(shinythemes)
library(palmerpenguins)
library(gganimate)
library(dplyr)
library(tidyr)
library(ggplot2)
library(gapminder)
data(package = 'palmerpenguins')
ui <- fluidPage(
               
                navbarPage(
                  "Animated penguins data",
                 
                  tabPanel("Navbar 2", 
                           
                           
                           ##########
                           
                           imageOutput('plot'),
                             
                           
                             hr(),
                             
                             fluidRow(
                               column(3,
                                      h4("Diamonds Explorer"),
                                      sliderInput('sampleSize', 'Sample Size', 
                                 min=1, max=nrow(penguins), value=min(1000, nrow(penguins)), 
                                                  step=500, round=0),
                                      br(),
                                      checkboxInput('jitter', 'Jitter'),
                                      checkboxInput('smooth', 'Smooth')
                               ),
                               column(4, offset = 1,
                              xValue -> selectInput('x', 'X', names(penguins)),
                     yValue -> selectInput('y', 'Y', names(penguins), names(penguins)[[2]]),
                  colorValue -> selectInput('color', 'Color', c('None', names(penguins)))
                               ),
                               column(4,
            rowValue -> selectInput('facet_row', 'Facet Row', c(None='.', names(penguins))),
      columnValue -> selectInput('facet_col', 'Facet Column', c(None='.', names(penguins)))
                               )
                             )
                           
                           #########
                           
                           
                          
                           ),
                  
       
                  
                ) # navbarPage
                
) # fluidPage

Идея подачи пришла отсюда: Как создать и отобразить анимированный GIF в Shiny? Сервер какой-то. как это enter image description here

# Define server function  
server <- function(input, output) {
  
  ##########################################
  output$plot <- renderImage({
    # A temp file to save the output.
    # This file will be removed later by renderImage
    outfile <- tempfile(fileext='.gif')
    
    # now make the animation
    p = myPenguins %>%
      ggplot(
        aes(xValue, yValue, color = colorValue)) + 
      geom_point() + 
      #geom_line() +
      facet_grid(rows = vars(rowValue), cols =  vars(columnValue))+
      theme_bw()+
      #theme_minimal() +
      transition_time(year)+
      labs(title = "Year: {frame_time}")+
      
      view_follow()#+
    
    anim_save("outfile.gif", animate(p)) # New
    
    # Return a list containing the filename
    list(src = "outfile.gif",
         contentType = 'image/gif')
    
    }, deleteFile = TRUE)
  
  
  ################################################################
  }

shinyApp(ui = ui, server = server)

Когда я пытаюсь запустить ваш код, я получаю сообщение об ошибке: Ошибка в nrow (пингвины): объект «пингвины» не найден. Также неясно ваше описание вашей проблемы: какая переменная, которую вы «определяете» в пользовательском интерфейсе, недоступна на сервере? Что вы хотите сделать с ним на сервере? Какое отношение Shinythemes имеет к проблеме? И т.д

Limey 09.04.2022 20:37

@Limey Спасибо. загружаю вопрос. Взглянуть. :)

Flora 09.04.2022 20:43
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
0
2
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

Ваша проблема связана с тем, что виджеты ввода Shiny (обычно) возвращают строки, тогда как функции ggplot ожидают символы в качестве аргумента. Это особенность использования tidyverse нестандартной оценки (NSE).

В результате интерфейс между Shiny и tidyverse может вызвать недоумение, когда вы впервые сталкиваетесь с ним. Одним из решений является использование оператора взрыва (!!) и функции sym.

Следующее приложение отображает многогранную диаграмму рассеивания, на которой пользователь имеет полный контроль над переменными, которые

  • нанесены по оси x
  • нанесены по оси Y
  • определить цвета нанесенных точек
  • определить строки фасетов
  • определить фасетные столбцы
library(shiny)
library(tidyverse)

ui <- fluidPage(
  selectInput("x", "X variable:", names(diamonds)),
  selectInput("y", "Y variable", names(diamonds), selected="price"),
  selectInput("colour", "Colour: ", names(diamonds), selected="color"),
  selectInput("facetRows", "Facet rows: ", names(diamonds), selected="clarity"),
  selectInput("facetCols", "Facet columns", names(diamonds), selected="cut"),
  plotOutput("plot")
)

server <- function(input, output) {
  output$plot <- renderPlot({
     diamonds %>% 
      ggplot() +
        geom_point(aes(x=!!sym(input$x), y=!!sym(input$y), colour=!!sym(input$colour)))  +
        facet_grid(rows=vars(!!sym(input$facetRows)), cols=vars(!!sym(input$facetCols)))
  })
}

shinyApp(ui = ui, server = server)

enter image description here

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

Я считать, это дает ответ на ваш вопрос, но я не совсем уверен из-за множества разрозненных функций в вашем коде (например, сохранение файла GIF, использование gganimate, ссылка на gapminder), которые не кажутся относящимися к вопросу о использование входных данных пользовательского интерфейса при вызове renderPlot. Если я не дал вам то, что вы хотите, пожалуйста, уточните свой вопрос и код, чтобы они ссылались только на элементы, которые имеют решающее значение для фундаментальной проблемы.

Эта почта поможет вам построить минимальный воспроизводимый пример.

Большое спасибо! Вот именно, что меня смущает! И я полностью согласен с тем, что вы сказали о проблеме выбора переменных. Не могли бы вы дать мне больше предложений о том, как ограничить выбор? Например. если переменные "числовая_переменная 1", "числовая_переменная 2", "категориальная_переменная 1", "категориальная_переменная 2". И только строки фасета являются "categorical_variable 1" или "categorical_variable 2". (Я знаю, как выбрать только одну переменную по selectInput("x", "X variable:", names(penguins)[[1]], но есть ли способ выбрать 2 из них?

Flora 10.04.2022 12:08

Другие вопросы по теме