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