Как мне анимировать вывод моего графика R Shiny на основе приращения входного значения ползунка? - PullRequest
0 голосов
/ 25 марта 2019

Я просмотрел учебники R Shiny и stackoverflow для ответов, связанных с моим запросом.Я обычно жду 3-4 дня, чтобы решить проблему с кодированием, прежде чем пытаюсь опубликовать сообщение.

У меня есть анимированный ползунок в моем пользовательском интерфейсе, который проходит через временной интервал в столбце (столбец a).Я пытаюсь создать анимированный линейный график, который отображает значения y другого столбца (столбца b), соответствующего nrow () этого временного интервала.Слайдер работает отлично, но я не смог построить вывод.

Возможно, я пропустил некоторые понятия, связанные с реактивностью, в приложении Shiny.Цените любые рекомендации, которые я могу получить, связанные с моим запросом.Я буду рад опубликовать больше информации, если это необходимо.

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()
  })
}



Так же, как демонстрация, я хотел, чтобы анимированный сюжет получился таким, но в соответствии со значениями слайдера пользовательского интерфейса:

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)

1 Ответ

0 голосов
/ 25 марта 2019

Достигает ли это того, что вы ищете? Обратите внимание, что я удалил первый элемент, 0, из вектора a, поскольку в вашем исходном примере было больше элементов в 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()
    }

  })
}
...