R Shiny-如果两个输入值相同,如何显示反馈消息(使用shinyFeedback)

R Shiny-如果两个输入值相同,如何显示反馈消息(使用shinyFeedback),r,validation,shiny,R,Validation,Shiny,我的应用程序中有两个selectizeInput(state1和state2)具有相同的选项集。当用户单击actionButton时,我希望比较state1和state2的值,如果它们相同,则向用户显示一条反馈消息 两个SelectizeInput都使用占位符“按名称搜索”进行初始化。如果我第一次更改一个输入的值,而另一个输入的值保持其占位符值不变,则单击操作按钮会触发反馈消息: 这让我感到困惑,因为只有当state1和state2相同时,才会显示消息 以下是重现上述内容的代码: libra

我的应用程序中有两个selectizeInput(
state1
state2
)具有相同的选项集。当用户单击actionButton时,我希望比较
state1
state2
的值,如果它们相同,则向用户显示一条反馈消息

两个SelectizeInput都使用占位符“按名称搜索”进行初始化。如果我第一次更改一个输入的值,而另一个输入的值保持其占位符值不变,则单击操作按钮会触发反馈消息:

这让我感到困惑,因为只有当
state1
state2
相同时,才会显示消息

以下是重现上述内容的代码:

library(shiny)
library(shinyFeedback)


ui <- fluidPage(shinyFeedback::useShinyFeedback(),
                selectizeInput('state1', 'Select state 1', choices = state.name, 
                               multiple = T, 
                               options = list(placeholder = "Search by name", maxItems = 1)),

                selectizeInput('state2', 'Select state 2', choices = state.name, 
                               multiple = T, 
                               options = list(placeholder = "Search by name", maxItems = 1)),

                actionButton("click", "Click"),

                textOutput("states")
)

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

  values = reactiveValues(states = NULL)

  observeEvent(input$click, {

    feedbackDanger("state1", input$state1 == input$state2, "")

    feedbackDanger("state2", input$state2 == input$state1, "State 1 and state 2 cannot be the same.")

    req(!is.null(input$state1), !is.null(input$state2), input$state1 != input$state2)

    values$states <- paste(input$state1, input$state2)

  })

  output$states <- renderText({

    values$states

  })
}

shinyApp(ui, server)
库(闪亮)
图书馆(shinyFeedback)
用户界面编辑:2019-02-13
该漏洞已在GitHub版本的
shinyFeeback
中解决。如果您从GitHub安装包,您的原始代码应该可以工作:

devtools::install_github("merlinoa/shinyFeedback")
--

问题 你的思路是对的!在第一个示例中,
input$state1
为“阿拉斯加”,而
input$state2
为空。带有
multiple=T
selectizeInput
的初始值为
NULL

当您的
feedbackDanger
条件比较这两个值时,结果为空逻辑:

> "Alaska" == NULL
logical(0)
空逻辑作为空对象传递给
shinyFeedback
javascript函数。当在布尔上下文中遇到空对象时,空对象是,因此“被视为
true
”。因此,当
checkFeedback
计算值时:

if (message.condition) {

   ....
该语句返回
true
,并显示
feedbackDanger
消息

解决方案 一个简单的解决方案是首先检查任一值是否为
NULL
,然后检查是否相等,如下所示:

((!is.null(input$state1) & !is.null(input$state2)) && (input$state1 == input$state2))
library(shiny)
library(shinyFeedback)


ui <- fluidPage(shinyFeedback::useShinyFeedback(),
                selectizeInput('state1', 'Select state 1', choices = state.name, 
                               multiple = T, 
                               options = list(placeholder = "Search by name", maxItems = 1)),

                selectizeInput('state2', 'Select state 2', choices = state.name, 
                               multiple = T, 
                               options = list(placeholder = "Search by name", maxItems = 1)),

                actionButton("click", "Click"),

                textOutput("states")
)

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

    values = reactiveValues(states = NULL)

    observeEvent(input$click, {
        condition <- ((!is.null(input$state1) & !is.null(input$state2)) && (input$state1 == input$state2))

        feedbackDanger("state1", condition, "")

        feedbackDanger("state2", condition, "State 1 and state 2 cannot be the same.")

        req(!is.null(input$state1), !is.null(input$state2), input$state1 != input$state2)

        values$states <- paste(input$state1, input$state2)

    })

    output$states <- renderText({

        values$states

    })
}

shinyApp(ui, server)
编辑:我们使用
和&
,以便首先评估任一值是否为
NULL
。只有当两个值都不为空时,我们才能评估这些值是否相同。按此顺序求值可避免将空逻辑发送到JS函数。有关
&
&
的更多信息,请参阅/Edit

完整的工作解决方案如下所示:

((!is.null(input$state1) & !is.null(input$state2)) && (input$state1 == input$state2))
library(shiny)
library(shinyFeedback)


ui <- fluidPage(shinyFeedback::useShinyFeedback(),
                selectizeInput('state1', 'Select state 1', choices = state.name, 
                               multiple = T, 
                               options = list(placeholder = "Search by name", maxItems = 1)),

                selectizeInput('state2', 'Select state 2', choices = state.name, 
                               multiple = T, 
                               options = list(placeholder = "Search by name", maxItems = 1)),

                actionButton("click", "Click"),

                textOutput("states")
)

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

    values = reactiveValues(states = NULL)

    observeEvent(input$click, {
        condition <- ((!is.null(input$state1) & !is.null(input$state2)) && (input$state1 == input$state2))

        feedbackDanger("state1", condition, "")

        feedbackDanger("state2", condition, "State 1 and state 2 cannot be the same.")

        req(!is.null(input$state1), !is.null(input$state2), input$state1 != input$state2)

        values$states <- paste(input$state1, input$state2)

    })

    output$states <- renderText({

        values$states

    })
}

shinyApp(ui, server)
库(闪亮)
图书馆(shinyFeedback)

非常感谢您的详细解释!我不熟悉“真实”的价值观,所以我真的很欣赏它。请您解释一下为什么在第二次比较中选择使用&&而不是&,好吗?@user51462不客气!很乐意帮忙。我在答案中添加了使用&&而不是&的解释。希望它有意义@user51462该错误已修复。如果您直接从GitHub下载包,那么您的原始代码应该可以工作。我编辑了答案以反映这一点