假设我下面有以下测试应用。我正在寻找的是如何复制reactiveValues
解决方案的功能。如果您使用该应用程序,则会发现isolate
影响功能的方式存在一种差异。使用反应性值,我可以在反应性列表中选择要隔离的元素。
因此,如果用户单击按钮1,则时间将始终更改。因此,时间将始终显示在观察中。如果用户单击同一按钮,则由于data
不变,因此仅显示时间。如果在按钮之间切换单击,则将同时显示按钮的名称和时间。
您似乎无法使用reactive
复制此功能。我的问题是我正在使用reactivePoll
的实际情况。我的reactPoll返回一个列表myData
。我想做的是仅在isolate
更改时才能myData$firstel
。但是似乎从myData
更新的任何反应式都将更新myData$firstel
或myData$secondel
的变化。有办法解决吗?我尝试将我的reactPoll转换为reactValues,但似乎不起作用
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)
答案 0 :(得分:0)
您可以使用以下代码段将反应式列表reacList
转换为reactValues对象reacVals
。
reacVals <- reactiveValues()
observe(
purrr::imap(reacList(), function(val, name) {
reacVals[[name]] <- val
})
)
reacList
中的任何元素更改时,reactiveValues
中的所有元素都会更新。但是,这些更新仅在元素值实际更改时才使其他依赖项无效。这意味着您可以使用reacVals
创建特定于元素的依赖关系,这是您想要实现的。
我知道您已经尝试将reactivePoll
对象转换为reactiveValues
对象,但这可能与您的方法不同。