如何根据滑块输入值的增量为我的 R Shiny 图的输出设置动画?

How do I animate my R Shiny plot's output based on the increments of slider input value?

我查看了 R Shiny 教程和 Whosebug,寻找与我的查询相关的答案。在尝试 post 之前,我通常会等待 3-4 天来解决编码问题。

我的 UI 中有一个动画滑块,它在列(a 列)的时间间隔内循环。我试图制作一个动画线图,绘制另一列(b 列)的 y 值,对应于该时间间隔的 nrow()。滑块工作完美,但我无法绘制输出。

我可能错过了一些与 Shiny 应用程序中的反应性相关的概念。感谢我可以获得与我的查询相关的任何指导。如果需要,我很乐意 post 更多信息。

a <- c(0,1,2,3,4,5,6)    
b <- c(50,100,40,30,20,80)    

mydata <- cbind(a,b)    
mydata <- as.data.frame(mydata())

ui <- fluidPage (

  headerPanel("basic app"),

  sidebarPanel(

    sliderInput("slider",
                label = "Time elapsed",
                min = 0,
                max = nrow(mydata()),
                value = 1, step = 1,
                animate =
                  animationOptions(interval = 200, loop = TRUE))
  ),
  mainPanel(
    plotlyOutput("plot")
  )
)

server <- function(input, output) {
  sliderValues <- reactive({
    data.frame(
      Name = "slider",
      Value = input$slider)
  })
  output$plot <- renderPlot({
    x<- as.numeric(input$slider)
    y <- as.numeric(b[x])
    ggplot(mydata,aes_string(x,y))+ geom_line()
  })
}



作为演示,我希望动画情节像这样出现,但对应于 UI 滑块值:

library(gganimate)
library(ggplot2)
fake <- c(1,10)
goods <- c(11,20)
fakegoods <- cbind(fake,goods)
fakegoods <- data.frame(fakegoods)
ggplot(fakegoods, aes(fake, goods)) + geom_line() + transition_reveal(1, fake)

这是否实现了您正在寻找的目标?请注意,我从向量 a 中删除了第一个元素 0,因为您的原始示例在 a 中的元素多于 b,并且为了使它们成为 cbind 他们必须是相同的长度。

library(ggplot2)
library(shiny)

a <- c(1,2,3,4,5,6)    
b <- c(50,100,40,30,20,80)    

mydata <- cbind(a,b)    
mydata <- as.data.frame(mydata)

ui <- fluidPage (

  headerPanel("basic app"),

  sidebarPanel(

    sliderInput("slider",
                label = "Time elapsed",
                min = min(mydata$a),
                max = max(mydata$a),
                value = min(mydata$a), step = 1,
                animate =
                  animationOptions(interval = 200, loop = TRUE))
  ),
  mainPanel(
    plotOutput("plot")
  )
)

server <- function(input, output) {
  output$plot <- renderPlot({
    plotdata <- mydata[1:which(input$slider==mydata$a),]
    p <- ggplot(plotdata,aes(x = a,y = b))

    if(nrow(plotdata)==1) {
      p + geom_point()
    } else {
      p + geom_line()
    }

  })
}