如何将用户输入与 R shiny 中的 gganimate 图形连接起来?

How to connect user input with gganimate graph in R shiny?

有没有办法 link 用户输入(x 轴、y 轴、颜色等)到 R shiny 中的 gganimate 图形?这样当用户从下拉列表中选择不同的输入(x 轴、y 轴、颜色等)时。 gganimate 图表会填充不同的 x 轴、y 轴、颜色等,以便可以相应地更改?

我试过的编码如下。由于我在 UI 中保存的变量名(xValue、yValue、colorValue 等放入 ggplot 函数)导致错误,不适用于服务...

UI 代码的想法来自这里:https://shiny.rstudio.com/articles/layout-guide.html 它会像这样显示:

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

服务的想法来自这里:How to create and display an animated GIF in Shiny? 服务器是……像这样

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

您的代码距离 minimal 还很远,我没有很多您引用的包,但我认为以下内容将说明允许您执行的技术你想要什么。我的代码基于 diamonds 数据集,它是 ggplot2.

的一部分

你的问题是由于 Shiny 输入小部件(通常)return 字符串,而 ggplot 函数期望符号作为它们的参数。这是tidyverse使用non-standard求值(NSE)的一个特点。

因此,当您第一次遇到 Shiny 和 tidyverse 之间的界面时,可能会感到困惑。一种解决方案是使用 bang-bang 运算符 (!!) 和 sym 函数。

以下应用显示多面散点图,其中用户可以完全控制

  • 绘制在 x 轴上
  • 绘制在y-axis
  • 定义标绘点的颜色
  • 定义构面行
  • 定义构面列
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)

请注意,diamonds 数据集非常大,对于我上面提到的五个角色中的任何一个,变量选择不当都会导致长时间的延迟!

认为 这提供了您问题的答案,但我不完全确定,因为您的代码中有许多不同的功能(例如保存 GIF 文件、使用gganimate,对 gapminder) 的引用似乎与在对 renderPlot 的调用中使用 UI 输入的问题无关。如果我没有给你你想要的,请完善你的问题和代码,以便它们仅引用对 fundamnetal 问题至关重要的元素。

This post 将帮助您构建一个最小的可重现示例