r-如何在shine中隔离反应列表的元素



假设我有下面的测试应用程序。我正在寻找的是如何复制reactiveValues解决方案的功能。如果你玩这个应用程序,你会注意到isolate影响功能的方式有一个不同。使用电抗值,我可以在电抗列表中选择要隔离的元素。

因此,如果用户单击按钮1,时间将始终更改。所以时间总是会印在观察中。如果用户单击相同的按钮,由于data没有更改,因此只显示时间。如果在按钮之间切换单击,则会显示按钮名称和时间。

使用reactive似乎无法复制此功能。我的问题是我使用reactivePoll的真实场景。我的reactivePoll返回一个列表myData。我想做的是只有当myData$firstel发生变化时才能使用isolate。但似乎任何从myData更新的反应范式都会更新myData$firstel变化还是myData$secondel变化。有办法解决这个问题吗?我试着将我的reactivePoll转换为reactiveValues,但它似乎不起的作用

library(shiny)
ui <- fluidPage(
actionButton("button1","Button 1"),
actionButton("button2","Button 2"),
textOutput("output1"),
textOutput("output2")
)
server <- function(input,output,session){
myreactval <- reactiveValues(data = NULL, selection = NULL)
observeEvent(input$button1,{
myreactval$data <- Sys.time()
myreactval$selection <- "button1"
})
observeEvent(input$button2,{
myreactval$data <- Sys.time()
myreactval$selection <- "button2"
})

myreact <- eventReactive(input$button1,{
res <- list()
res$data <- Sys.time()
res$selection <- "button1"
return(res)
})

output$output1 <- renderText({ myreact()$data })
output$output2 <- renderText({ myreact()$selection })
# REACTIVE SOLUTION
# observe({
#   print(myreact()$selection)
# })
# observe({
#   print(isolate(myreact())$data)
# })
# REACTIVE VALUES SOLUTION
observe({
print(myreactval$selection)
})
observe({
print(isolate(myreactval)$data)
})
}
shinyApp(ui,server)

您可以使用以下代码段将反应列表reacList转换为反应值对象reacVals

reacVals <- reactiveValues()
observe(
purrr::imap(reacList(), function(val, name) {
reacVals[[name]] <- val
})
)

reacList中的任何元素改变时,reactiveValues的所有元素都被更新。但是,这些更新只会在元素值实际发生更改时使进一步的依赖关系失效。这意味着您可以使用reacVals来创建特定于元素的依赖项,这正是您想要实现的。

我知道您已经尝试将reactivePoll对象转换为reactiveValues对象,但这可能与您的方法不同。

最新更新