私は、複数のリアクティブコンポーネントが、計算が遅い関数から同じ結果を使用する光沢のあるアプリケーションを持っています。遅い関数を複数回計算するのを避けるために、入力が変化したときに関数を再計算し、それを必要とするすべての反応コンポーネントで結果を利用できるようにするために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)
})
}
どのようにインクリメントされ
他のすべての値を通知する必要があります。これらの値は、 'table_updated'を確認する必要があります –
@KeqiangLiありがとう - 確かに可能なアプローチのように聞こえます。あなたが望むなら、それを答えとして投稿してください。 – dww
確かに、回答として追加 –