【发布时间】:2017-09-29 12:20:09
【问题描述】:
我试图让一个 UI 元素与另一个元素发生反应,然后测试第一个元素是否等于一个特定值。我似乎能够打印出反应元素的值,但我不能在 if 语句中使用它来检查它的值。代码如下。我已经注释掉了第 23 行周围的麻烦部分。它在注释掉的行的情况下运行,并验证反应元素 input$paramRes1 确实具有 1 - 5 之间的整数字符值,正如预期的那样,但是当我取消注释时检查该整数值是否为 1 的行,它告诉我 input$paramRes1 为空。确切的错误是:
Warning:
Error in if: argument is of length zero
Stack trace (innermost first):
59: observerFunc [#16]
4: <Anonymous>
3: do.call
2: print.shiny.appobj
1: <Promise>
为什么它会告诉我 input$paramRes1 为空,当它打印为一个字符时?还是我误读了错误?感谢您的帮助!
suppressWarnings(library(shiny))
suppressWarnings(library(shinyFiles))
ui <- function(request) {
fluidPage(
uiOutput("param1"),
uiOutput("param2"),
fluidRow(column(12, verbatimTextOutput("value", placeholder = T)))
)
}
server <- function(input, output, session) {
state = reactiveValues()
observe({
state$choice <- setNames(as.list(c(1, 2, 3, 4, 5)), c("First", "Second",
"Third", "Fourth", "Fifth"))
})
output$param1 <- renderUI({
selectInput("paramRes1", "Select Param 1", state$choice, selected = 1)
})
output$param2 <- renderUI({
textInput("paramNm", "Param", value = input$paramRes1, width = '150px')
})
observe({
# if (input$paramRes1 %in% 1) {
state$val <- input$paramRes1
# } else {
# state$val <- 0
# }
})
output$value <- renderText({ str(state$val) })
}
shinyApp(ui = ui, server = server)
【问题讨论】:
-
能否请您编辑您的代码,以便您的示例代码可重现?我注意到,无论你有
state$"var",它都应该被称为函数state()$"var"...这可能与你的问题无关,但你没有包含足够的内容让我们使用 -
在闪亮的情况下,
input变量始终使用值NULL进行初始化,因此您的服务器逻辑应该能够处理它。使用observeEvent而不是observe适用于您的示例,因为observeEvent默认情况下会忽略空值。 -
当我通过 observeEvent(input$paramRes1, { if (input$paramRes1 %in% "1") { state$val
-
我是否以这种方式滥用 obeserveEvent(),期望当 input$paramRes1 初始化为 NULL 时,input$paramRes1 值的变化(通过 UI 的变化)应该导致重新评估(input$paramRes1 %in% "1") 的条件?