if语句摆脱:if:参数长度为零时出错

时间:2016-09-15 20:06:10

标签: r shiny

想法

根据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) &&放入if()条件,但它只是将初始错误更改为

  

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

问题

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

强制shiny强制{{1}}不在应用内显示错误消息的其他更常见的黑客行为?

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

3 个答案:

答案 0 :(得分:1)

每当你得到一个你在R中不确定的错误时,首先要做的是尝试隔离它并使用browser()来查看错误发生之前发生的事情。执行此操作后,我发现错误与闪亮或用户界面无关,这只是因为您尝试将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")
    }
  })
}

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

答案 1 :(得分:0)

有效的黑客攻击:

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

答案 2 :(得分:0)

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