【问题标题】:How to create IF statement with reactive values in R ( Shiny )如何在 R ( Shiny ) 中创建具有反应值的 IF 语句
【发布时间】:2016-06-10 06:25:20
【问题描述】:

R 初学者,在这里闪耀! 试图做一个最小的工作示例......我想检查反应输入值的条件。我做错了什么?

library(shiny)

ui<-fluidPage(

  numericInput(inputId="a", label=NULL, value=0),
  textOutput(outputId="out")
)

server <- function(input, output) {
  x <- reactive(input$a)
  if (x() < 4) 
    {y<-1}
  else
  {y<-0}

  output$out <- renderText({y})
}

shinyApp(ui = ui, server = server)

错误信息:

在没有活跃的反应上下文的情况下不允许操作。 (你试过 做一些只能从反应式内部完成的事情 表达式或观察者。)

【问题讨论】:

  • 如消息所述,您只能在反应式上下文中使用x()(例如,在observelocalrender.... 函数中)。此外,您的y 值必须在function 之外定义,并且与使用它的级别相同或更高。
  • @warmoverflow :所以没有办法检查反应值的条件?抱歉,对 R 来说超级新手
  • 您可以但必须在其中一个上下文中。例如,您可以在 renderText 内查看
  • BTW input$a 本身已经是响应式的,因此您不需要用 reactive 将其括起来并分配给新变量。
  • @warmoverflow:我明白了。那真不幸。这是尝试在renderOutputs之外进行大量计算的最小工作示例,因为我的真实代码(1)更长,并且(2)有多个基于y的输出,并且在每个renderOutput中重新计算它真的很慢.谢谢

标签: r shiny


【解决方案1】:

您只需将reactiveif 一起使用,这样shiny 就会知道yx 发生变化时会发生变化。

library(shiny)

ui<-fluidPage(

  numericInput(inputId="a", label=NULL, value=0),
  textOutput(outputId="out")
)

server <- function(input, output) {
  x <- reactive(input$a)
  y <- reactive( if (x()<4) 1 else 0 )

  output$out <- renderText({ y() })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 啊哇太棒了!将整个 IF 语句分配给一个变量对我来说并不直观,但你是对的。
【解决方案2】:

上面 John Paul 的回答当然是可以接受的,但我认为您可能希望看到另一种方式作为您学习过程的一部分。我会让 StackOverflow 整理出哪个更可取。

library(shiny)

ui<-fluidPage(

  numericInput(inputId="a", label=NULL, value=0),
  textOutput(outputId="out")
)

server <- function(input, output) {
  state <- reactiveValues()

  observe({
    state$x <- input$a
    state$y <- ifelse(state$x < 4, 1, 0)
  })

  output$out <- renderText({ state$y })
}

shinyApp(ui = ui, server = server)

【讨论】:

  • 您知道这里是否有理由使用reactiveValues 更可取吗?我的印象是 RStudio 的人更喜欢这个,但我不完全理解它的优势是什么。
  • 我看了会议的视频,我采用了这种方法,但不幸的是不知道为什么。我即将真正深入研究闪亮的内部结构,所以也许我会弄清楚。对于一个大而复杂的项目,我认为reactiveValues 方法简化了一些代码。我希望 StackOverflow 上的其他人能启发我们。
  • @timelyportfolio 哦,我喜欢这个!我将不得不使用 reactiveValues() 和 Observe() 但它似乎更容易,不必跟踪哪些值是反应性的,并确保所有下游变量都分配有 reactive()
【解决方案3】:

这是我的尝试。 1) 如前所述,您不需要将 input$a 包装在反应式上下文中并另存为 x。只需使用 input$a 2) 在这个简单的示例中,您不需要 reactiveValues。只需将 y 保存为反应变量。然后,在 renderText 中,调用函数 ("y()") 访问

library(shiny)

ui<-fluidPage(

  numericInput(inputId="a", label=NULL, value=0),
  textOutput(outputId="out")
)

server <- function(input, output) {

  y <- reactive({
    if (input$a < 4) {
      return(1)
    } else {
      return(0)
    }
  }
  )

  output$out <- renderText({y()})
}

shinyApp(ui = ui, server = server)

【讨论】:

    猜你喜欢
    • 2018-04-19
    • 1970-01-01
    • 2022-01-12
    • 1970-01-01
    • 2019-02-12
    • 2014-11-23
    • 2021-12-14
    • 2021-12-06
    • 2023-03-08
    相关资源
    最近更新 更多