【问题标题】:if statement get rid of: Error in if: argument is of length zeroif 语句摆脱:if 中的错误:参数长度为零
【发布时间】:2016-09-22 18:38:33
【问题描述】:

想法

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

问题

我开发的代码实际上可以工作,但在选择任何选项之前会显示

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)

尝试的解决方案

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

错误:需要 TRUE/FALSE 的地方缺少值

问题

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

还有其他更通用的 hack 来强制 shiny 不在应用内显示错误消息吗?

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

【问题讨论】:

    标签: r shiny


    【解决方案1】:

    每当您在 R 中遇到不确定的错误时,首先要做的是尝试隔离它并使用browser() 来查看错误之前发生的情况。完成此操作后,我发现该错误与闪亮或 UI 无关,只是因为您试图将 factor(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")
        }
      })
    }
    

    使用调试器我看到了正在使用的值

    【讨论】:

    • 您的回答很有帮助。在与同事讨论后,我设法找到了解决问题的方法。有兴趣可以看我的回答。
    • 尚未查看您的答案,但我认为您不需要“找到解决方法”。这是闪亮的一个非常常见的问题,简单的正确解决方案是简单地使用req() 函数或在处理之前检查正确的输入
    【解决方案2】:

    包含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"]
          }
        )
      })
    }
    

    【讨论】:

      【解决方案3】:

      一个有效的技巧:

      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((length(input$input) > 1) && 
               (data[which(input$input == data[, "name"]), "coward"] != FALSE)){
              data[which(input$input == data[, "name"]), "coward"]
            }
          )
        })
      }
      

      【讨论】:

      • 确实没有显示错误,但即使指定了变量“coward”,应用程序也不会显示。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      • 2020-07-05
      • 1970-01-01
      • 2016-11-26
      • 1970-01-01
      相关资源
      最近更新 更多