【问题标题】:Is there any way to set priority in reactive functions in Shiny?有没有办法在 Shiny 中设置反应函数的优先级?
【发布时间】:2020-09-12 18:42:32
【问题描述】:

我对 2 个反应函数有疑问。问题是,我需要其中一个在第二个之前执行。代码如下:

    sumItemsValues <- reactive({
      actualData <- switch (input$sumTabs,
                            area = sumAreaValues(),
                            kg = sumKgValues(),
                            yield = sumYieldValues(),
                            profits = sumProfitsValues(),
                            price = sumPriceValues(),
                            profitability = sumProfitabilityValues()
      )
    })
    
    sumValues <- reactive({
        actualData <- switch (input$sumTabs,
                            area = areaSum(),
                            kg = kgSum(),
                            yield = yieldSum(),
                            profits = profitsSum(),
                            price = priceSum(),
                            profitability = profitabilitySum()
        )
    })

在这两个功能之间,还有更多功能,当我运行应用程序并在短时间内切换选项卡时,我看到一个错误,但它很快消失了。错误是因为它首先尝试执行第二个函数,而第二个函数要求执行第一个函数。感谢您的宝贵时间。

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    您可以在第二个函数中使用req:

     sumItemsValues <- reactive({
          switch (input$sumTabs,
                  area = sumAreaValues(),
                  kg = sumKgValues(),
                  yield = sumYieldValues(),
                  profits = sumProfitsValues(),
                  price = sumPriceValues(),
                  profitability = sumProfitabilityValues()
          )
        })
        
        sumValues <- reactive({
            req(sumItemsValues())
            switch (input$sumTabs,
                    area = areaSum(),
                    kg = kgSum(),
                    yield = yieldSum(),
                    profits = profitsSum(),
                    price = priceSum(),
                    profitability = profitabilitySum()
            )
        })
    

    【讨论】:

    • 不应该是req(sumItemsValues())吗?另外,在reactive 语句中,为什么要对actualData 使用赋值?
    • @Valeri 感谢您的反馈,我在这方面太快了。是的,它是req(sumItemsValues()),是的,我复制了原始帖子,但 sumValues 仅在分配时不会输出任何内容。我更正了帖子。
    • @Waldi Assignment 实际上会返回输出,只是默默地返回。这就是x &lt;- y &lt;- 2 起作用的原因
    • @SmokeyShakers,不是函数的输出:试试f &lt;- function(){a &lt;- 1}; f()
    • @Waldi 你错了。 f() 正在默默地返回一个值。在你的代码尝试之后,x &lt;- f() 然后x 在控制台中
    【解决方案2】:

    除了使用电抗导体 (reactive),您还可以使用电抗值和 observeEvent,它有一个 priority 选项:

    sumItemsValues <- reactiveVal(NULL)
    sumValues <- reactiveVal(NULL)
    
    observeEvent(input$sumTabs, {
      actualData <- switch(
        input$sumTabs,
        area = sumAreaValues(),
        kg = sumKgValues(),
        yield = sumYieldValues(),
        profits = sumProfitsValues(),
        price = sumPriceValues(),
        profitability = sumProfitabilityValues()
      )
      sumItemsValues(actualData)
    }, priority = 2)
    
    observeEvent(input$sumTabs, {
      actualData <- switch(
        input$sumTabs,
        area = areaSum(),
        kg = kgSum(),
        yield = yieldSum(),
        profits = profitsSum(),
        price = priceSum(),
        profitability = profitabilitySum()
      )
      sumValues(actualData)
    }, priority = 1)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-27
      • 1970-01-01
      • 2012-05-03
      • 2016-04-30
      • 1970-01-01
      相关资源
      最近更新 更多