2016-10-27 124 views
1

我在Shiny中使用reactiveValues很多,因为它们比只有inputoutput对象更灵活。嵌套reactiveValues是棘手的,因为任何孩子的任何变化都会触发与父母相关的反应性。为了解决这个问题,我试图制作两个不同的对象(不是同一个列表中的两个对象,而是两个不同的列表),它似乎正在工作。我无法找到任何这方面的例子,并想知道它是否应该以这种方式工作。是否有可能因此发生的问题?在一个闪亮的应用程序中的多个reactiveValues

在这个应用程序中,有两个反应值对象 - reac1reac2。它们中的每一个分别链接到一个下拉列表,分别为column1column2。更改column1column2将使用最新时间更新反应值,更新绘图并在reac1reac2中打印最新值。

ui = fluidPage(
    titlePanel("Multiple reactive values"), 
    sidebarLayout(
    sidebarPanel(
     selectInput(inputId = "column1", "Reac1", letters, selected = "a"), 
     selectInput(inputId = "column2", "Reac2", letters, selected = "a") 
    ), 
    mainPanel(
     plotOutput("plot1") 
    ) 
) 
) 

server = function(input, output, session) { 
    reac1 <- reactiveValues(asdasd = 0) 
    reac2 <- reactiveValues(qweqwe = 0) 

    # If any inputs are changed, set the redraw parameter to FALSE 
    observe({ 
    input$column2 
    reac2$qweqwe = Sys.time() 
    }) 

observe({ 
    input$column1 
    reac1$asdasd = Sys.time() 
    }) 


    # Only triggered when the copies of the inputs in reac are updated 
    # by the code above 
    output$plot1 <- renderPlot({ 
     print(paste(reac1$asdasd, 'reac1')) 
     print(paste(reac2$qweqwe, 'reac2')) 
     hist(runif(1000)) 
    }) 
} 
shinyApp(ui, server) 
+0

我同意,我发现reactiveValues在许多情况下比其他闪亮的表达式更方便,尽管它们在闪亮的文档和示例中没有很好的记录。看看这个问题http://stackoverflow.com/questions/39436713。在您的特定示例中,它可以与单个reactiveValue一起使用。你能展示一个你提到的问题的代码示例吗? –

+0

为了保持我的变量有组织,我希望有一个列表作为reactiveValue的一个元素(类似'reactveValues(somelist = list(a = 1,b = 1,c = 1))') 。该列表将具有多个在各个地方使用的元素。现在如果我更新这个列表中的一个元素,说'a',那么反应性似乎被传递给'somelist'。因此,即使'b'没有改变,任何其他的块调用'somelist $ b'也会被触发。 – TheComeOnMan

回答

0

ReactiveValues像输入$的读/写版本,你可以有一个reactiveValue列表里面的几个“独立”的变量。所以,在你的例子中你不需要两个反应值。见下面的代码。

ui = fluidPage(
    titlePanel("Multiple reactive values"), 
    sidebarLayout(
    sidebarPanel(
     selectInput(inputId = "column1", "Reac1", letters, selected = "a"), 
     selectInput(inputId = "column2", "Reac2", letters, selected = "a") 
    ), 
    mainPanel(
     verbatimTextOutput("txt1"), 
     verbatimTextOutput("txt2") 
    ) 
) 
) 

server = function(input, output, session) { 
    reac <- reactiveValues() 
    #reac2 <- reactiveValues(qweqwe = 0) 

    # If any inputs are changed, set the redraw parameter to FALSE 

    observe({ 
    reac$asdasd = input$column1 
    }) 
    observe({ 
    reac$qweqwe = input$column2 
    }) 

    # Only triggered when the copies of the inputs in reac are updated 
    # by the code above 
    output$txt1 <- renderPrint({ 
    print('output 1') 
    print(paste(reac$asdasd, 'reac1')) 
    }) 

    output$txt2 <- renderPrint({ 
    print('output2') 
    print(paste(reac$qweqwe, 'reac2')) 
    }) 

} 
shinyApp(ui, server) 
+0

就像我在我的评论中提到的为了逻辑的缘故,我想要将这些值中的一些值。在我的问题中,reac1和reac2是reactiveValues的两个逻辑组。另一种解决问题的方法是获得一份清单,“reactveValues(somelist = list(a = 1,b = 1,c = 1)))',但这会造成我在我的评论中提到的问题。我会尝试为此添加代码。 – TheComeOnMan

相关问题