独立反应在 Shiny App 中相互作用

Independent reactions are interacting in a Shiny App

我正在使用带有 animate 参数的 sliderInput 函数在我的 shinyApp 中执行自动计算。但是,使用 animate 会影响我的应用程序中的其他反应。我想停止在其他反应中发生的这种副作用。

例如,我在 if else 结构中有一个 dropdownMenu。但是,由于 animate 参数,我无法在启动动画时单击右上角的选项。它随着动画所做的每一次计算而消失。参见:

我尝试在 pred_1() 中使用 isolate() 但它停止了 valueBox 和条件结构(if else 结构)。

我只想animate不影响应用程序中的其他反应。

我的应用程序:

library(shiny)
library(shinydashboard)

header <- dashboardHeader(
  
  title = "Dashboard", 
  titleWidth = 300, 
  
  dropdownMenuOutput(
    outputId = "drop1"
  )
  
)

sidebar <- dashboardSidebar(
  
  width = 300
  
)

body <- dashboardBody(
  
  sliderInput(
    inputId = "one", 
    label = "Registro 1", 
    value = 1, 
    animate = animationOptions(
      interval = 500, loop = TRUE
    ),  
    min = 1, 
    max = 10, 
    step = 1, 
    ticks = TRUE
  ), 
  
  sliderInput(
    inputId = "two",
    label = "Registro 2", 
    value = 1, 
    animate = animationOptions(
      interval = 500, loop = TRUE
    ),  
    min = 1, 
    max = 10, 
    step = 1, 
    ticks = TRUE
  ), 
  
  sliderInput(
    inputId = "three", 
    label = "Sum 3", 
    value = 1, 
    animate = animationOptions(
      interval = 500, loop = TRUE
    ),  
    min = 1, 
    max = 10, 
    step = 1, 
    ticks = TRUE
  ), 
  
  valueBoxOutput(
    outputId = "box1"
  )
  
)

ui <- dashboardPage(
  
  header = header, 
  sidebar = sidebar, 
  body = body
  
)

server <- function(session, input, output) {
  
  fx <- function(x, y) {
    
    x + y
    
  }
  
  fy <- function(x) {
    
    x
    
  }
  
  reac_0 <- reactive({
    
    tibble::tibble(
      one = input$one, 
      two = input$two, 
      three = input$three
    )
    
  })
  
  chuveiro <- reactive({
    
    temp <- reac_0()
    fx(
      x = temp$one, 
      y = temp$two
    )
    
  })
  
  luz <- reactive({
    
    temp <- reac_0()
    fy(
      x = temp$three
    )
    
  })
  
  fdrop <- function(x) {
    
    if (x <= 5) {
        
      dropdownMenu(
        type = "notifications",
        badgeStatus = NULL,
        headerText = "Not 1", 
        notificationItem(
          text = HTML(
            "<text style='color:#020202;'>Without.</text>"
          ),
          status = "danger",
          icon = icon("times"),
          href = NULL
        )
      )
      
    } else (
      dropdownMenu(
        type = "notifications",
        badgeStatus = "danger",
        headerText = "Not 2", 
        notificationItem(
          text = HTML(
            "<a style='color:#020202;'
          href='https://www.instagram.com' target='_blank' title='A'>
          With</a>"
          ),
          status = "success",
          icon = icon("tags")
        )
      )
    )
  }
  
  output$drop1 <- renderMenu({
    
    expr = fdrop(x = luz())
    
  })
  
  output$box1 <- renderValueBox({
    
    expr = valueBox(
      value = chuveiro(), 
      subtitle = "Sum"
    )
    
  })
  
}

shinyApp(ui, server) 

那么我怎样才能在 shinyApp 中使一种反应影响另一种反应?

我想使用 sliderInputanimate 正常点击下拉菜单通知。

我尝试隔离 sliderInput 的每个参数,但没有用。

只要输入发生变化,就会触发 reac0() 反应。然后它会触发包含它的每个反应,即使该反应中使用的值没有改变。

您的代码:

reac_0 <- reactive({
  tibble::tibble(
    one = input$one, 
    two = input$two, 
    three = input$three
  )
})
 
luz <- reactive({
  temp <- reac_0()
  fy(
    x = temp$three
  )
})

每当 onetwothree 发生变化时触发 luz()

另一种方法是直接使用 input$three

luz <- reactive({
  fy(
    x = input$three
  )
})

这样,滑块onetwo的变化或动画不会触发luz(),也不会触发菜单渲染。

当然,由于滑块three的值是用来渲染菜单的,任何更新它的值都必须触发菜单渲染。