2017-03-25 4 views
1

Shinyアプリケーション内のhtmlWidgetsパッケージからonRender()関数を使用しています。私は特定のonRender()関数呼び出しの中で作成する特定のオブジェクトを保存しようとしているので、それらはonRender()関数呼び出しの外側で使用できるようになっています。htmlWidgetsでonRender()関数で作成されたオブジェクトを保存する

以下は私のMWEです。私はonRender()関数でval2というオブジェクトを作成しています。これはスライダーの入力値に2を掛けたものです。val2オブジェクトを保存して、後でonRender()関数の外で使用できるようにすることはできますか? (私は、この単純化された例ではval2オブジェクトを作成するためにonRender()関数を使う必要はないが、この例を単純にしています)。

ありがとうございました!

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) 
+0

すべてのフィードバック私のために? –

+0

ありがとうございます。非常に役立ちます!私の本当の問題(MWEだけではない)に取り組んでいるようですので、今私はコーディングに関する質問がないと思います。概念としては、サーバーとクライアントの間で値を前後に移動することが非効率的であることに注意すると、これは特定の状況(大きなデータセットなど)で特に問題があると思われますか?それは私のためにかなり速く働いているようですが、パフォーマンスが危険にさらされるような非効率的なアプリケーションがあるかどうかを知っていただければ幸いです。ありがとうございました。 – luckButtered

+1

shinyServerからクライアントに細いパイプを介して大きなデータ構造を渡していたのでは、間違いなく問題になる可能性があります。しかし、あなたがPC上で、あるいはLAN経由でも使っているのであれば、私は心配しません。 –

答えて

1

これはそうです。私はあなたの例を少しインタラクティブに変更しました。次に、javascript、h3タグ(最初に動作しています)、そして反応性のinputリスト(これはもっと便利です)の要素として、「val2」の値を2回格納します。値がサーバーとクライアントの間を行き来するので、これは非常に効率的ではないように見えることに注意してください。ここで

はコードです:

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) 

そしてここでは、作業アプリのスクリーンショットです:

enter image description here

読む価値releventポストがこれです:Sending Shiny data from client to server

関連する問題