我有一个闪亮的应用程序,其中多个反应组件使用计算速度慢的函数的相同结果。为避免多次计算慢速函数,我可以使用set(MKL_INCLUDE_DIRS ${MKL_ROOT_DIR}/include)
if(NOT EXISTS "${MKL_INCLUDE_DIRS}/mkl_version.h") # added these 3 lines
mkl_fail() #
endif() #
get_mkl_version(${MKL_INCLUDE_DIRS}/mkl_version.h)
在输入更改时重新计算函数,并使结果可用于需要它的所有反应组件。
但是,如果reactiveValues()
对象是reactiveValues
,并且我使用data.table
更新它,则shine不会检测到更改,并且依赖它的输出不会更新
有没有办法使用data.table通过引用分配:=
或其他避免多次重新计算函数的方法。
以下是使用data.table assign-by-reference的可重现示例,其中reactiveValues
在输入更改时无法更新:
output$result2
为了进行比较,这里是使用data.frames标准分配的服务器函数的一个版本,它按预期执行:
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)
答案 0 :(得分:1)
假设您已定义了一个反应变量table_updated
,因此每次执行慢速功能时都可以将其增加一。其他值/图只需要观察table_updated
。
实际上actionButton(see description section)执行相同的操作,每次单击它时,其值都会增加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)
})