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);
}"
)
Используя 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)
Ах, я на это надеюсь... Можете ли вы уточнить, что вы подразумеваете под экспортом функций? Какова ваша цель и что необходимо реализовать, есть ли у вас где-нибудь пример?
В приведенном выше примере кода R используется функция R hc_exporting
, которая предоставляет пользователю возможность загрузить исходные данные в формате .csv или экспортировать график. Ссылка на API находится здесь: api.highcharts.com/highcharts/exporting.
Я попробовал добавить chart.exporting[0].update({enabled: true})
, похоже, не помогло, но мои знания js очень ограничены.
У вас это почти есть. Ставьте [0]
и все должно работать. Пожалуйста, посмотрите мой обновленный ответ и скажите, подходит ли он.
Идеальный! Как новичок в js, что делает [0] для осей x и y?
xAxis
и yAxis
— это массивы, и с помощью [0]
вы получаете доступ к первому элементу этого массива. Представьте себе случай, когда у вас есть несколько осей, и вы можете применить определенное поведение только к некоторым осям. API говорит: «В случае нескольких осей узел xAxis представляет собой массив объектов конфигурации».
Фантастика! Есть ли способ добавить функции экспорта?