Преобразование расширяемой спарклайна Plotly в график HighCharter в карте bslib с помощью javascript

bslib имеет полезную документацию по расширяемым спарклайнам . В документации используется JavaScript для изменения существующего графика при раскрытии карты. Я пытаюсь имитировать то же поведение, но для высокого сюжета, а не сюжетного сюжета.

Я хочу, чтобы это было в JavaScript, а не использовало shiny::getCurrentOutputInfo(), поскольку это создает задержку при расширении и сворачивании окна.

Я бы хотел, чтобы на графике были видны оси x и y, а также чтобы график можно было экспортировать при расширении и скрывать эти элементы при свертывании. По сути, это то поведение, которое я хотел бы видеть при использовании функции getCurrentOutputInfo (обратите внимание на задержку и повторный рендеринг графика).

Пример приложения

library(shiny)
library(bslib)
library(highcharter)

ui <- page_fluid(
    value_box(
      title = "Test",
      value = "Test",
      showcase = highchartOutput("hcp"),
      showcase_layout = showcase_top_right(),
      full_screen = TRUE,
      theme = "success"
  )
)

server <- function(input, output) {
  
  df <- data.frame(dose=c("D0.5", "D1", "D2"),
                   len=c(4.2, 10, 29.5))
  
  output$hcp <- renderHighchart({
    highchart_scatter()
  })
  
  highchart_scatter <- function(x) {
    info <- getCurrentOutputInfo()
    large <- isTRUE(info$height() > 200)
    
    df2 <- df %>% 
      hchart('line', hcaes(x = dose, y = len))
    
    if (large){
      df2 <- df2 %>%
        hc_exporting(enabled = TRUE)
    } else {
      df2 <- df2 %>%
        hc_xAxis(visible = FALSE) %>% 
        hc_yAxis(visible = FALSE)
    }
    return(df2)
  }
}

shinyApp(ui, server)

А это пример js-кода для преобразования сюжета, который я, по сути, хотел бы имитировать.

пример построения графика на JavaScript

  htmlwidgets::onRender(
    "function(el) {
      var ro = new ResizeObserver(function() {
         var visible = el.offsetHeight > 200;
         Plotly.relayout(el, {'xaxis.visible': visible});
      });
      ro.observe(el);
    }"
  )
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
0
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используя js, вы можете сделать это следующим образом:

library(shiny)
library(bslib)
library(highcharter)

ui <- page_fluid(
  value_box(
    title = "Test",
    value = "Test",
    showcase = highchartOutput("hcp"),
    showcase_layout = showcase_top_right(),
    full_screen = TRUE,
    theme = "success"
  )
)

server <- function(input, output) {
  
  df <- data.frame(dose=c("D0.5", "D1", "D2"),
                   len=c(4.2, 10, 29.5))
  
  output$hcp <- renderHighchart({
    highchart_scatter() |> 
      htmlwidgets::onRender("function(el, x) {
                              var ro = new ResizeObserver(function() {
                                var visible = el.offsetHeight > 200;
                                var chart = $('#' + el.id).highcharts()
                              
                                chart.xAxis[0].update({
                                  visible: visible
                                })
                              
                                chart.yAxis[0].update({
                                  visible: visible
                                })

                                chart.exporting.update({
                                  enabled: visible
                                })
                              });
                              ro.observe(el);
                            }")
  })
  
  highchart_scatter <- function(x) {
    
    df2 <- df %>% 
      hchart('line', hcaes(x = dose, y = len))

    return(df2)
  }
}

shinyApp(ui, server)

Фантастика! Есть ли способ добавить функции экспорта?

D.sen 05.04.2024 19:26

Ах, я на это надеюсь... Можете ли вы уточнить, что вы подразумеваете под экспортом функций? Какова ваша цель и что необходимо реализовать, есть ли у вас где-нибудь пример?

Jan 05.04.2024 19:31

В приведенном выше примере кода R используется функция R hc_exporting, которая предоставляет пользователю возможность загрузить исходные данные в формате .csv или экспортировать график. Ссылка на API находится здесь: api.highcharts.com/highcharts/exporting.

D.sen 05.04.2024 19:35

Я попробовал добавить chart.exporting[0].update({enabled: true}), похоже, не помогло, но мои знания js очень ограничены.

D.sen 05.04.2024 19:35

У вас это почти есть. Ставьте [0] и все должно работать. Пожалуйста, посмотрите мой обновленный ответ и скажите, подходит ли он.

Jan 05.04.2024 19:55

Идеальный! Как новичок в js, что делает [0] для осей x и y?

D.sen 05.04.2024 20:09
xAxis и yAxis — это массивы, и с помощью [0] вы получаете доступ к первому элементу этого массива. Представьте себе случай, когда у вас есть несколько осей, и вы можете применить определенное поведение только к некоторым осям. API говорит: «В случае нескольких осей узел xAxis представляет собой массив объектов конфигурации».
Jan 05.04.2024 20:16

Другие вопросы по теме