if 语句摆脱: if 中的错误:参数长度为零

Sie*_*ski 3 r shiny

这个想法

根据selectizeInput()输入,我想显示数据框中的一行数据。但是,某些变量只有在其值不是 时才会显示FALSEselectizeInput()包括一个占位符提示,这是非常理想的。

问题

我开发的代码实际上可以工作,但是直到选择任何选项为止

if 中的错误:参数长度为零

在应用程序内部,这是非常不可取的。

示例代码

library("shiny")

# simulate data
data <- data.frame(
  name = c("Adam", "Debbie", "Lancelot", "Dracula"),
  age = c(21, 48, 72, 1023),
  coward = c("yes, a coward", "just a little bit", FALSE, "too old to be a coward")
)

ui <- fluidPage(
  # selectize
  selectizeInput(
    inputId = "input",
    label = NULL,
    choices = c("..." = "", as.character(data[, "name"])),
    selected = NULL,
    multiple = FALSE
  ),
  # show output
  uiOutput(outputId = "output")
)

server <- function(input, output, session){
  output$output <- renderUI({
    div(
      # show name
      data[which(input$input == data[, "name"]), "name"], br(),
      data[which(input$input == data[, "name"]), "age"], br(),
      # if "coward" is not FALSE than show its value
      if(data[which(input$input == data[, "name"]), "coward"] != FALSE){
        data[which(input$input == data[, "name"]), "coward"]
      }
    )
  })
}

shinyApp(ui, server)
Run Code Online (Sandbox Code Playgroud)

尝试过的解决方案

尝试将if()语句包装在suppressWarnings()or中suppressMessages()。不会改变任何东西。还尝试放入!is.null(input$input) &&内部if()条件,但它只是将初始错误更改为

错误:需要 TRUE/FALSE 时缺少值

问题

如何编写条件以便shiny在选择选项之前不会返回错误selectizeInput()

还有其他更通用的黑客方法可以强制shiny不在应用程序内显示错误消息吗?

我觉得我在这里遗漏了一些明显的东西......

Dea*_*ali 8

每当您在 R 中遇到不确定的错误时,首先要做的就是尝试隔离它并使用它browser()来查看错误发生之前发生的情况。这样做之后,我发现该错误与闪亮或用户界面无关,这只是因为您试图将 afactor(0)FALSE.

input$input的初始值为"". data[which(input$input == data[, "name"]), "coward"]这意味着 的初始值是factor(0)。这意味着您的 if 语句正在进行factor(0) == FALSE比较,这会中断。

为了弄清楚我需要做的就是将服务器代码简化为

server <- function(input, output, session){
  observe({
    mydata <- data[which(input$input == data[, "name"]), "coward"]
    browser()
    if (mydata == FALSE) {
      cat("hello")
    }
  })
}
Run Code Online (Sandbox Code Playgroud)

使用调试器我看到正在使用哪些值

  • 没有看过你的答案,但我认为你不需要“找到解决方法”。这是闪亮的一个非常常见的问题,简单正确的解决方案是简单地使用 `req()` 函数或在处理之前检查正确的输入 (2认同)

Sie*_*ski 6

包含函数的答案browser()确实有助于定位问题的根源,但真正的解决方案是使用函数或函数req()的组合。请参阅相应页面以了解如何使用它们。validate()need()help()

简而言之,这些函数的作用是检查给定的参数是否已指定。参考示例代码,解决方案可能如下所示:

server <- function(input, output, session){
  output$output <- renderUI({
    # check if input$input is specified
    # if not stop executing the rest of this code block
    req(input$input)
    div(
      # show name
      data[which(input$input == data[, "name"]), "name"], br(),
      data[which(input$input == data[, "name"]), "age"], br(),
      # if "coward" is not FALSE than show its value
      if(data[which(input$input == data[, "name"]), "coward"] != FALSE){
        data[which(input$input == data[, "name"]), "coward"]
      }
    )
  })
}
Run Code Online (Sandbox Code Playgroud)