Работая над приложением, я заметил, что блестящий пересчитывает вывод, когда он не нужен (на мой взгляд), и, похоже, он зависит от вложенности в reactiveValues
.
UI:
library(shiny)
n <- 5
o <- paste0('o', 1:n)
ui <- fluidPage(
lapply(o, function(x) textOutput(x)),
actionButton('a1', 'a1')
)
Сервер один (пересчитывает выходные данные, как я ожидал):
server <- function(input, output){
rv <- reactiveValues(o1='a', o2='b', o3='c', o4='d', o5='e')
lapply(o, function(x){
output[[x]] <- renderText({
cat('rendering', x, '\n')
rv[[x]]
})
})
observeEvent(input$a1, {
rv$o1 <- rnorm(1)
})
}
Сервер два (каждый выход пересчитывается при нажатии кнопки):
server <- function(input, output){
rv <- reactiveValues(
# difference with server one is that o1-5 are nested in l
l=list(o1='a', o2='b', o3='c', o4='d', o5='e')
)
lapply(o, function(x){
output[[x]] <- renderText({
cat('rendering', x, '\n')
rv$l[[x]]
})
})
observeEvent(input$a1, {
rv$l$o1 <- rnorm(1)
})
}
При запускеприложение с сервером одно, каждый раз, когда нажимается кнопка, только o1
пересчитывается (как напечатано в консоли). Однако при запуске приложения с сервером два, каждый раз, когда нажимается кнопка, все результаты пересчитываются.
Мне было интересно, как блестяще определяются зависимости. Может ли он различать зависимости только на верхнем уровне reactiveValues
или есть способ заставить вывод зависеть только от более глубокого уровня reactiveValues
? Другими словами, если мне нужна / нужна ситуация, как на втором сервере, могу ли я предотвратить пересчет выходов, отличных от o1
, при нажатии кнопки?