Изменение цвета вывода текста при изменении значения текста при аннулировании с помощьюtivtiveTimer в блестящем - PullRequest
0 голосов
/ 17 марта 2020

Я создаю панель инструментов для финансовых акций. У меня есть коробка с ценой акции. Цена акций меняется каждую минуту. То, что я хочу, так как цена акций меняется, цвет должен ненадолго измениться, чтобы отразить тип изменения. Например, если последняя цена ниже предыдущей последней цены, я хочу, чтобы цвет текста изменялся на * flara sh красный, но возвращался к цвету по умолчанию, который является черным. Это похоже на то, что происходит в Google Finance при изменении цены (см., Например, результат поиска Google для jse: npn)

Вот наиболее удаленная версия моего кода.

library(quantmod)
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)

ui <- dashboardPage(
  dashboardHeader(title = "Example"),

  dashboardSidebar(
    sidebarMenu(
      ID = "tabs",
      menuItem(text = "Naspers", tabName = "tabNaspers", icon = icon("chart-line"))
    )
  ),

  dashboardBody(

    tags$head(tags$style(HTML('.fas { font-size: 36px; }

                          .fas {
                            vertical-align: middle;
                          }
                          #'
              ))),

    tabItems(

      tabItem(tabName = "tabNaspers",
              fluidRow(

                column(
                  width = 7,
                  boxPlus(title = span("ALL SHARE", style = "color: rgb(128,128,128); font-size: 22px"),
                          collapsible = TRUE,
                          closable = FALSE,
                          enable_dropdown = TRUE,
                          dropdown_icon = "NULL",
                          status = 'success',
                          valueBoxOutput('npn_price', 12),
                          valueBoxOutput('npn_day_change', 12),
                          width = 4
                  )

                )

              )        

      )

    )
  )

)


npn_close <- 203059.00

server <- function(input, output, session){

    autoInvalidate <- reactiveTimer(intervalMs = 60000)

    output$npn_price <- renderUI({

      autoInvalidate()

      npn_last <- getQuote("NPN.JO", what=yahooQF("Last Trade (Price Only)"))[, 2]

      npn_change <- round((npn_last - npn_close) / npn_close, 4) * 100

      arrow_color <- ifelse(npn_change > 0, 'rgb(15, 157, 88)' ,'rgb(226, 74, 26)')

      npn_diff <- npn_last - npn_close

      npn_diff <- ifelse(npn_diff < 0, paste0('-', npn_diff), paste0('+', npn_diff))

      tags$div(HTML(paste0('<span style="font-size: 24px"><strong>',
                          npn_last, '</strong></span>', '<span style="color:', arrow_color, '; font-size: 14px">', npn_diff, '</span>')))

    })


    output$npn_day_change <- renderUI({

      autoInvalidate()

      npn_last <- getQuote("NPN.JO", what=yahooQF("Last Trade (Price Only)"))[, 2]

      npn_change <- round((npn_last - npn_close) / npn_close, 4) * 100

      npn_change <- paste0(npn_change, "%")

      arrow_color <- ifelse(npn_change > 0, 'rgb(15, 157, 88)' ,'rgb(226, 74, 26)')

      arrow_icon <- ifelse(npn_change < 0, '"fas fa-caret-down"', '"fas fa-caret-up"')

      tags$div(HTML(paste0('<i class=', arrow_icon, ' style = "color:', arrow_color, 
                          ';"></i><span style="color:', arrow_color,'; font-size: 24px"><strong>',
                           npn_change, '</strong></span>')))

    })



}


shinyApp(ui, server)

1 Ответ

1 голос
/ 18 марта 2020

Конечно. Таким образом, мы сохраняем цену, получаем новую цену, если цена снижается, делаем текст красным, а затем снова быстро запускаем, чтобы получить эффект fla sh.

Для тестирования я добавил кнопки для имитации роста и уменьшения цены. Я также сделал это проверять изменения чаще.

Длина fla sh может быть изменена в этой строке: invalidateLater(1200).

library(quantmod)
library(shiny)
library(shinydashboard)
library(shinydashboardPlus)
library(shinyWidgets)

ui <- dashboardPage(
    dashboardHeader(title = "Example"),

    dashboardSidebar(
        sidebarMenu(
            ID = "tabs",
            menuItem(text = "Naspers", tabName = "tabNaspers", icon = icon("chart-line"))
        )
    ),

    dashboardBody(

        tags$head(tags$style(HTML('.fas { font-size: 36px; }.fas {vertical-align: middle;} #'))),

        tabItems(

            tabItem(tabName = "tabNaspers",
                    fluidRow(

                        column(
                            width = 7,
                            boxPlus(title = span("ALL SHARE", style = "color: rgb(128,128,128); font-size: 22px"),
                                    collapsible = TRUE,
                                    closable = FALSE,
                                    enable_dropdown = TRUE,
                                    dropdown_icon = "NULL",
                                    status = 'success',
                                    valueBoxOutput('npn_price', 12),
                                    valueBoxOutput('npn_day_change', 12),
                                    width = 4
                            )

                        )

                    ),

                    #Buttons to simulate stock going up, so that we don't have to wait for the stock to actually go up or down
                    actionButton('btn_stockgoesup',   'Simulate Stock Going Up'),
                    actionButton('btn_stockgoesdown', 'Simulate Stock Going Down')

            )

        )
    )

)


npn_close <- 203059.00

server <- function(input, output, session){

    autoInvalidate <- reactiveTimer(intervalMs = 6000)

    #Buttons to simulate stock going up, so that we don't have to wait for the stock to actually go up or down
    observeEvent(input$btn_stockgoesup,   {npn_last_stored <<- 0  ;  print('At the next update the stock will simulate going up')})
    observeEvent(input$btn_stockgoesdown, {npn_last_stored <<- Inf;  print('At the next update the stock will simulate going down')})

    output$npn_price <- renderUI({

        autoInvalidate()

        npn_last <- getQuote("NPN.JO", what=yahooQF("Last Trade (Price Only)"))[, 2]

        #Handle when app first starts and there is no stored value to compare against
        if(exists('npn_last_stored') == FALSE) {npn_last_stored <<- npn_last}

        if(npn_last < npn_last_stored) {

            #Stock went down
            print('stock went down')
            npn_color <- 'rgb(220, 50, 20)'
            invalidateLater(1200)

        } else {

            #Stock went up / not changed
            print('stock went up / not changed')
            npn_color <- 'rgb(0, 0, 0)'

        }

        #Update stored value
        npn_last_stored <<- npn_last

        npn_change <- round((npn_last - npn_close) / npn_close, 4) * 100

        arrow_color <- ifelse(npn_change > 0, 'rgb(15, 157, 88)' ,'rgb(226, 74, 26)')

        npn_diff <- npn_last - npn_close

        npn_diff <- ifelse(npn_diff < 0, paste0('-', npn_diff), paste0('+', npn_diff))

        tags$div(HTML(paste0('<span style="color:', npn_color, '; font-size: 24px"><strong>', npn_last, '</strong></span>', '<span style="color:', arrow_color, '; font-size: 14px">', npn_diff, '</span>')))

    })


    output$npn_day_change <- renderUI({

        autoInvalidate()

        npn_last <- getQuote("NPN.JO", what=yahooQF("Last Trade (Price Only)"))[, 2]

        npn_change <- round((npn_last - npn_close) / npn_close, 4) * 100

        npn_change <- paste0(npn_change, "%")

        arrow_color <- ifelse(npn_change > 0, 'rgb(15, 157, 88)' ,'rgb(226, 74, 26)')

        arrow_icon <- ifelse(npn_change < 0, '"fas fa-caret-down"', '"fas fa-caret-up"')

        tags$div(HTML(paste0('<i class=', arrow_icon, ' style = "color:', arrow_color,';"></i><span style="color:', arrow_color,'; font-size: 24px"><strong>',npn_change, '</strong></span>')))

    })

}

shinyApp(ui, server)
...