在 htmlWidgets 中保存在 onRender() 函数中创建的对象

Save object created in onRender() function in htmlWidgets

我在 Shiny 应用程序中使用 htmlWidgets 包中的 onRender() 函数。我正在尝试保存我在给定的 onRender() 函数调用中创建的某些对象,以便可以在给定的 onRender() 函数调用之外使用它们。

下面是我的MWE。我正在 onRender() 函数中创建一个名为 val2 的对象,它只是滑块输入值乘以 2。我可以保存 val2 对象,以便稍后在 onRender() 函数之外使用它吗? (我意识到在这个过度简化的示例中我不需要使用 onRender() 函数来创建 val2 对象,但我试图使示例保持简单)。

感谢您的宝贵意见!

library(plotly)
library(htmlwidgets)
library(shiny)

myPlot <- qplot(data=mtcars, mpg, cyl)
gMyPlot <- ggplotly(myPlot)

ui <- shinyUI(fluidPage(
  sliderInput("ci", "Value:", min = 0, max = 1, value=0.95, step=0.01),
  plotlyOutput("myTest")
))

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

  ci <- reactive(input$ci)

  output$myTest <- renderPlotly(gMyPlot %>% onRender("
                  function(el, x, data) {
                  val2 = data * 2
                  console.log(val2)
                  }", data=ci()))})

shinyApp(ui, server)

这样做。我修改了您的示例,使其更具交互性。然后我使用 javascript 两次存储 "val2" 值,一次在 h3 标签中(我首先开始工作),然后作为反应式 input 列表的元素(更多当然有用)。请注意,这似乎不是很有效,因为值在服务器和客户端之间来回传递。

代码如下:

library(plotly)
library(htmlwidgets)
library(shiny)

ui <- shinyUI(fluidPage(
  tags$h3('',class ='val2'),
  sliderInput("ci", "Value:", min = 0, max = 34, value=34, step=1),
  plotlyOutput("myPlot"),
  textOutput("outval2")
))

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

  ci <- reactive(input$ci)

  output$myPlot <- renderPlotly({
            mdf <- mtcars %>% filter(mpg<ci())
            myPlot <- qplot(data=mdf, mpg, cyl)
            ggplotly(myPlot) %>% onRender("function(el, x, data) {
                                            val2 = data * 2
                                            console.log(val2)
                                            $('h3.val2').text('val2:'+val2);
                                            Shiny.onInputChange('val2', val2);
                                            }", data=ci())
            })
  output$outval2 <- renderPrint({sprintf("The calculated value is:%d",input$val2)})
  }
)
shinyApp(ui, server)

这是工作应用程序的屏幕截图:

值得一读的相关post是这样的:Sending Shiny data from client to server