2017-05-19 6 views
2

私は、複数のリアクティブコンポーネントが、計算が遅い関数から同じ結果を使用する光沢のあるアプリケーションを持っています。遅い関数を複数回計算するのを避けるために、入力が変化したときに関数を再計算し、それを必要とするすべての反応コンポーネントで結果を利用できるようにするためにreactiveValues()を使用できます。R Shiny:data.tableでreactabelValues()を使用して参照を割り当てよう

reactiveValuesオブジェクトがdata.tableで、:=を使用して更新すると、shinyは変更を検出せず、それに依存する出力は更新されません。

reactiveValuesまたは関数の複数回の再計算を避ける別の方法で、参照によってdata.tableを使用する方法はありますか。ここで

output$result2入力が変化したときに更新取得に失敗したdata.tableアサイン・バイ・リファレンスを使用して再現性の例である:比較のため

library(shiny) 
library(data.table) 
library(plotly) 

ui = fluidPage(
    sidebarLayout(
    sidebarPanel(
     sliderInput('x1', 'x1', min=0, max=2, value=1, step=0.1) 
    ), 
    mainPanel(
     plotlyOutput('result1'), 
     verbatimTextOutput('result2') 
    ) 
) 
) 

server = function(input, output) { 
    values <- reactiveValues() 
    values$dt = data.table(v1 = 1:100, v2 = 1) 

    slow.func = function(my.dt, x) { 
    Sys.sleep(2) 
    my.dt[, v2 := v1^x] 
    } 

    output$result1 = renderPlotly({ 
    values$dt = slow.func(values$dt, input$x1) 
    plot_ly(values$dt) %>% 
     add_lines(x = ~v1, y = ~v2) 
    })  
    output$result2 = renderText({ 
    paste('Final value =', values$dt[.N, v2]) 
    }) 
} 
shinyApp(ui = ui, server = server) 

、ここでは標準を使用してサーバ機能のバージョンがあります思ったとおりに動作しないdata.framesの割り当て、:

server = function(input, output) { 
    values <- reactiveValues() 
    values$dt = data.frame(v1 = 1:100, v2 = 1) 

    slow.func = function(my.dt, x) { 
    my.dt$v2 = my.dt$v1^x 
    Sys.sleep(2) 
    my.dt 
    } 

    output$result1 = renderPlotly({ 
    values$dt = slow.func(values$dt, input$x1) 
    plot_ly(values$dt) %>% 
     add_lines(x = ~v1, y = ~v2) 
    }) 

    output$result2 = renderText({ 
    paste('Final value =', values$dt[100,]$v2) 
    }) 
} 
+1

どのようにインクリメントされ

他のすべての値を通知する必要があります。これらの値は、 'table_updated'を確認する必要があります –

+0

@KeqiangLiありがとう - 確かに可能なアプローチのように聞こえます。あなたが望むなら、それを答えとして投稿してください。 – dww

+0

確かに、回答として追加 –

答えて

1

は、あなたがそうあなたが遅い関数が実行される1ずつそれをインクリメントすることができ、反応変数table_updatedを定義していると言います。他の値/プロットは、table_updatedを観察する必要があります。 actionButton(see description section)が同じことを実際に、それがクリックされるたびに、その値は単なるフラグとして「table_updated」反応性値を有し、かつ1ずつそれをインクリメントについて1.

values <- reactiveValues(table_updated = 0) 

slow.func = function(my.dt, x) { 
    # do stuff 
    values$table_updated <- values$table_updated + 1 
} 

output$result2 = renderText({ 
    values$table_updated 
    paste('Final value =', values$dt[100,]$v2) 
}) 
関連する問題