2016-09-15 68 views
0

想法if語句擺脫:如果在錯誤:參數爲長度爲零

根據selectizeInput()輸入我想從一個數據幀的顯示數據的一行。但是,一些變量只有在它們的值不是FALSE時才被顯示。 selectizeInput()包含一個佔位符提示,這非常可取。

問題

其實我開發的代碼工作,但直到任何選項被選中顯示

Error in if: argument is of length zero

的應用程序,這是極不可取的內部。

實施例代碼

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) 

嘗試的解決方案

試過在suppressWarnings()suppressMessages()包裹if()語句。不會改變任何東西。還試圖把!is.null(input$input) &&if()條件,但它只是改變了最初的錯誤

Error: missing value where TRUE/FALSE needed

問題

怎樣寫條件,使shiny不會選擇在selectizeInput()選項前返回一個錯誤?

任何其他更一般的黑客迫使shiny不顯示應用程序內的錯誤消息?

我覺得我真的缺少明顯的東西在這裏...

回答

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

確實沒有顯示錯誤,但即使指定了應用程序也沒有顯示變量「懦夫」。 – Siemkowski

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

並採用我所看到的價值正在被使用

+0

你的回答證實有幫助。與同事討論後,我設法找到了解決問題的方法。如果你有興趣,請看我的答案。 – Siemkowski

+0

沒有看過你的答案,但我認爲你不需要「找到解決方法」。這是一個非常常見的問題,簡單的正確解決方案是簡單地使用'req()'函數或在處理之前檢查正確的輸入 –