【问题标题】:shinyvalidate - using a reactive expression witin add_rule()shinyvalidate - 在 add_rule() 中使用反应式表达式
【发布时间】:2021-09-05 21:51:40
【问题描述】:

我正在尝试为我正在使用 shinyvalidate 包开发的应用程序实现用户反馈。我想与用户交流的一些反馈是他们选择的值是否在特定范围内。感兴趣的范围取决于他们所做的另一个输入(我已经包含了代码的简化表示)。

因此,是否满足感兴趣的先决条件取决于反应值。我首先定义一个函数来检查提供的值是否在指定范围内。然后我在 add_rule() 中调用这个函数,使用响应式作为函数的参数。这会导致一个错误,指出我无法使用 add_rule 访问反应式。应该是这种情况,因为 InputValidator 对象不是响应式消费者。

错误信息:

Warning: Error in Can't access reactive value 'num1' outside of reactive consumer.
i Do you need to wrap inside reactive() or observer()?
  55: <Anonymous>
Error: Can't access reactive value 'num1' outside of reactive consumer.
i Do you need to wrap inside reactive() or observer()?

但是,如果我在 add_rule() 中使用未命名的函数,我可以指定一个依赖于响应式的范围,并且不再收到错误消息。我使用的未命名函数和命名函数是相同的,我不明白为什么使用命名函数会收到错误消息,但使用命名函数时却没有收到错误消息。

这是我使用命名函数的代码:

library(shiny)
library(shinyvalidate)
checkRange <- function(value, value2){
  if(value < -2 * value2 || value > 2 * value2 ){
    paste0("Please specify a number that is within the range: ", -2 * value2, ":", 2 * value2, " - Tank you!")
  }
}

ui <- fluidPage(
  fluidRow(
           numericInput("num1",
                        "Please specify your first number",
                        value = NULL),
           numericInput("num2",
                        "Please specify a different number",
                        value = NULL),
           verbatimTextOutput("selectedNums")
  
)
)

server <- function(input, output, session){
  iv <- InputValidator$new()
  iv$add_rule("num1", sv_required())
  iv$add_rule("num2", sv_required())
  iv$add_rule("num2", checkRange, value2 = input$num1)
  iv$enable()
  output$selectedNums <- renderPrint({
    req(iv$is_valid())
    paste0("The first number = ", input$num1, " and the second number = ", input$num2)
  })
}

app <- shinyApp(ui, server)

runApp(app)

下面是使用匿名函数的代码(UI 和服务器代码基本相同,除了一次调用 iv$add_rule()):

library(shiny)
library(shinyvalidate)
ui <- fluidPage(
  fluidRow(
           numericInput("num1",
                        "Please specify your first number",
                        value = NULL),
           numericInput("num2",
                        "Please specify a different number",
                        value = NULL),
           verbatimTextOutput("selectedNums")
  
)
)

server <- function(input, output, session){
  iv <- InputValidator$new()
  iv$add_rule("num1", sv_required())
  iv$add_rule("num2", sv_required())
  iv$add_rule("num2", function(value){
    if(value < - 2 * input$num1 || value > 2 * input$num2){
      paste0("Please specify a number that is within the range: ", -2 * input$num1, ":", 2 * input$num1, " - Tank you!")
    }
  })
  iv$enable()
  output$selectedNums <- renderPrint({
    req(iv$is_valid())
    paste0("The first number = ", input$num1, " and the second number = ", input$num2)
  })
}

app <- shinyApp(ui, server)

runApp(app)

我更喜欢使用命名函数,因为我想多次重用代码。谁能帮我解释一下为什么我在命名函数中收到错误消息,而在未命名函数中却没有?

【问题讨论】:

    标签: r shiny shiny-reactivity shinyvalidate


    【解决方案1】:

    你可以这样做:

      iv$add_rule("num2", function(value){checkRange(value, input$num1)})
    

    【讨论】:

    • 非常感谢!您能否向我指出一些可能有助于我理解此代码为何有效的资源?我只是感到困惑,我不知道我错过了什么。
    猜你喜欢
    • 1970-01-01
    • 2016-04-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多