1

我在 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)
4

1 回答 1

0

这是这样做的。我修改了您的示例,使其更具交互性。然后我使用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)

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

在此处输入图像描述

值得一读的相关文章是:Sending Shiny data from client to server

于 2017-03-26T12:15:14.197 回答