Есть ли способ оживить датчик в R, в соответствии с конкретными значениями из вектора? - PullRequest
2 голосов
/ 14 июня 2019

Я пытаюсь создать анимированную диаграмму, которая изменяется в соответствии с определенными значениями, определенными в векторе. Это для блестящего приложения в R. Я в настоящее время использую библиотеку C3, но нет никаких ограничений. Я хочу кодировать это в R с блестящим.

Код ниже делает что-то похожее, но анимация работает со случайными значениями. Я хочу установить конкретные значения для каждого кадра анимации.

runApp(list(
ui = bootstrapPage(
# example use of the automatically generated output function
column(6, C3GaugeOutput("gauge1"))
),
server = function(input, output) {

    #riskList <- c(10,20,30,40,50,60,70,80,90,100)


    # reactive that generates a random value for the gauge
    value = reactive({
        invalidateLater(1000)
        round(runif(1,min=0,max=100),2)
    })

    # example use of the automatically generated render function
    output$gauge1 <- renderC3Gauge({ 
        # C3Gauge widget
        C3Gauge(value())
    })
}
))

Вывод должен быть аналогичен тому, который мы получаем при использовании анимированных диаграмм в виде графика с параметром кадра. У меня должен быть входной вектор (например, c (10,20,30,40,50)), кнопка воспроизведения и таблица датчиков в качестве выходных данных. Я хочу, чтобы датчик показывал и выводил 10, затем 20, затем 30 и т. Д., Как только я нажму кнопку.

1 Ответ

0 голосов
/ 17 июня 2019

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

library(c3)
library(shiny)

ui <- fluidPage(
  c3Output("gauge1"), 
  actionButton("start_button", "Start Engines")
)

server <- function(input, output, session) {
  gauge_breaks <- seq(0, 100, 10)
  is_animating <- FALSE
  current_index <- 1

  observeEvent(input$start_button, {
    current_index <<- 0
    is_animating <<- TRUE
  })

  gauge_value = reactive({
    invalidateLater(1000)

    if(is_animating)
      current_index <<- current_index + 1

    if(current_index == length(gauge_breaks))
      is_animating <<- FALSE

    data.frame(rpm = as.numeric(gauge_breaks[current_index]))
  })

  output$gauge1 <- renderC3({
    c3_gauge(c3(gauge_value()))
  })
}

Хотя мне не нравится использование оператора <<-, я обнаружил, что эту версию легче понять, чем другую.версия, в которой текущий индекс хранится в numericInput, скрытом внутри всегда скрытого conditionalPanel.Этот подход требовал isolate(), чтобы придерживаться invalidateLater(), а не обновлять gauge_value() сразу при каждом изменении индекса.

...