gpt4 book ai didi

javascript - Highcharter plot 仅在第二次点击后更新 - R Shiny

转载 作者:行者123 更新时间:2023-11-30 13:57:04 25 4
gpt4 key购买 nike

这是我的代码,类似于我今天已经发布的问题。现在我有另一个问题,我无法理解。当我单击 actionButton 更新图表时,图表仅在第二次单击后更新。 print 语句在第一次点击后起作用。这里出了什么问题?

library(highcharter)
library(shiny)
library(shinyjs)

df <- data.frame(
a = floor(runif(10, min = 1, max = 10)),
b = floor(runif(10, min = 1, max = 10))
)


updaterfunction <- function(chartid, sendid, df, session) {

message = jsonlite::toJSON(df)
session$sendCustomMessage(sendid, message)

jscode <- paste0('Shiny.addCustomMessageHandler("', sendid, '", function(message) {
var chart1 = $("', chartid, '").highcharts()

var newArray1 = new Array(message.length)
var newArray2 = new Array(message.length)

for(var i in message) {
newArray1[i] = message[i].a
newArray2[i] = message[i].b
}

chart1.series[0].update({
// type: "line",
data: newArray1
}, false)

chart1.series[1].update({
// type: "line",
data: newArray2
}, false)

console.log("code was run")

chart1.redraw();
})')

print("execute code!")
runjs(jscode)
}




# Define UI for application that draws a histogram
ui <- fluidPage(

# Application title
titlePanel("Update highcharter dynamically"),
#includeScript("www/script.js"),
useShinyjs(),

# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
actionButton("data", "Generate Data")
),

# Show a plot of the generated distribution
mainPanel(
highchartOutput("plot")
)
)
)


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


observeEvent(input$data, {

df1 <- data.frame(
a = floor(runif(10, min = 1, max = 10)),
b = floor(runif(10, min = 1, max = 10))
)

updaterfunction(chartid = "#plot", sendid = "handler", df = df1, session = session)

})


output$plot <- renderHighchart({

highchart() %>%

hc_add_series(type = "bar", data = df$a) %>%
hc_add_series(type = "bar", data = df$b)

})
}

# Run the application
shinyApp(ui = ui, server = server)

最佳答案

我想问题是,在第一次执行 observeEvent(input$data, {...}) 之后,您正在为您的绘图附加事件处理程序(实际上您正在添加每次单击按钮后的 CustomMessageHandler)。因此,在第一次单击按钮期间事件处理程序尚未附加(并且无法使用react)。

如果您在 session 启动时初始化 CustomMessageHandler 一次 并且仅在单击按钮时发送新消息,它会按预期工作:

library(highcharter)
library(shiny)
library(shinyjs)

df <- data.frame(
a = floor(runif(10, min = 1, max = 10)),
b = floor(runif(10, min = 1, max = 10))
)

updaterfunction <- function(sendid, df, session) {
message = jsonlite::toJSON(df)
session$sendCustomMessage(sendid, message)
}

# Define UI for application that draws a histogram
ui <- fluidPage(

# Application title
titlePanel("Update highcharter dynamically"),
#includeScript("www/script.js"),
useShinyjs(),

# Sidebar with a slider input for number of bins
sidebarLayout(
sidebarPanel(
actionButton("data", "Generate Data")
),

# Show a plot of the generated distribution
mainPanel(
highchartOutput("plot")
)
)
)


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

sendid <- "handler"
chartid <- "#plot"

jscode <- paste0('Shiny.addCustomMessageHandler("', sendid, '", function(message) {
var chart1 = $("', chartid, '").highcharts()

var newArray1 = new Array(message.length)
var newArray2 = new Array(message.length)

for(var i in message) {
newArray1[i] = message[i].a
newArray2[i] = message[i].b
}

chart1.series[0].update({
// type: "line",
data: newArray1
}, false)

chart1.series[1].update({
// type: "line",
data: newArray2
}, false)

console.log("code was run")

chart1.redraw();
})')

runjs(jscode)


observeEvent(input$data, {

df1 <- data.frame(
a = floor(runif(10, min = 1, max = 10)),
b = floor(runif(10, min = 1, max = 10))
)

updaterfunction(sendid = sendid, df = df1, session = session)

})


output$plot <- renderHighchart({

highchart() %>%

hc_add_series(type = "bar", data = df$a) %>%
hc_add_series(type = "bar", data = df$b)

})
}

# Run the application
shinyApp(ui = ui, server = server)

最后这也是 ignoreNULL = FALSE 所做的:它在 session 启动期间附加 CustomMessageHandler

请同时检查这个有用的article

关于javascript - Highcharter plot 仅在第二次点击后更新 - R Shiny,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57057061/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com