【问题标题】:Shiny - How to conditionally update a reactive or reactiveValue?Shiny - 如何有条件地更新响应式或响应式值?
【发布时间】:2017-04-17 21:06:05
【问题描述】:

我试图用一些 ifelse 条件来更新一个值。

例如,在下面的代码中,我只想在响应式“decim_factor”更改其值时更新响应式“乘数”,而不是仅更新它。我尝试将带有“decim_factor”的observeEvent用作eventExpr,但没有成功。

library(shiny)
rm(list = ls())

ui <- shinyUI(pageWithSidebar(
  headerPanel("Click the button"),
  sidebarPanel(
    numericInput("index","Numeric Input",1),

    p("This is the criteria to change the decim_factor depending on numericInput"),
    br(),
    p(" num_input >= 20 - decim_factor=3"),
    p("20  > num_input >= 10 - decim_factor=2"),
    p("10  > num_input       - decim_factor=1")

  ),
  mainPanel(
    verbatimTextOutput("decim"),
    verbatimTextOutput("multip")
  )
))


server <- shinyServer(function(input, output) {

  decim_factor <- reactive({
    num_input <- input$index
    if(num_input>=20)                      {decim_factor <- 3} 
    else if(10<=num_input & num_input<20)  {decim_factor <- 2}
    else                                    decim_factor <- 1
    as.numeric(decim_factor)
  })
  #I was trying to calculte the 'multiplier' only if 'decim_factor' changes its value
  #and not if it is updated
  #
  #I tried to use observeEvent, depending on decim_factor() but it didn't work
  #If I put the observeEvent function as comment it works, but the multiplier
  #updates every time I change the numeric_input
  observeEvent(decim_factor(),{
    multiplier <- reactive({
      decim_factor()*10
    })
  })

  #The outputs come with da Sis.time() just to check if the values are updated
  output$decim <- renderText({paste("Decim = ",decim_factor(), ";",Sys.time())})
  output$multip <- renderText({paste("Muliplier =", multiplier(), ";",Sys.time())})
}) 

shinyApp(ui,server)

【问题讨论】:

  • 试试multiplier &lt;&lt;- reactive({...,否则全局环境中没有设置乘数,也可以使用reactiveValues
  • “乘数

标签: r if-statement shiny


【解决方案1】:

即使你的decim_factor 的值没有改变,你也会在响应式中重置它,这样它就会触发更新multiplier 的observeEvent。如果你想防止这种情况,你可以这样做:

server <- shinyServer(function(input, output) {
        values <- reactiveValues(decim_factor=1,multiplier=10)

        observeEvent(input$index,{
                num_input <- input$index
                if(num_input>=20 & values$decim_factor != 3) {values$decim_factor <- 3} 
                else if(10<=num_input & num_input<20 & values$decim_factor != 2 )  {values$decim_factor <- 2}
                else if(10>num_input & values$decim_factor != 1) values$decim_factor <- 1
        })

        observeEvent(values$decim_factor,{
                values$multiplier <- values$decim_factor*10
        })

        output$decim <- renderText({paste("Decim = ",values$decim_factor, ";",Sys.time())})
        output$multip <- renderText({paste("Muliplier =", values$multiplier, ";",Sys.time())})
})

第一个observeEvent中的if/else仅在需要更改值时更新values$decim_factor

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-18
    • 2019-08-16
    • 2013-12-10
    • 2019-12-15
    • 2018-02-09
    • 2021-07-03
    • 1970-01-01
    相关资源
    最近更新 更多