2017-12-28 45 views
0

API의 데이터를 리플렛 맵에 플롯하는 반짝이는 앱이 있습니다. 또한 사용자로부터 전달 된 2 개의 입력을 API call으로 가져옵니다.r - 리플릿 반짝이는 앱에서 오류를 일으키는 빈 textInput()

그 중 하나는 API이 데이터를 가져와야하는 영역을 설정하는 텍스트 입력입니다. 사용자가 잘못된 지역 코드를 입력하거나 단순히 코드를 삭제하면 반짝이는 앱이 오류를 표시 한 다음 정확한 코드를 입력하고 앱이 정상적으로 돌아올 때까지 기다려야합니다. 어색하고보기에 좋지 않습니다.

if(is.null(APIdata()))if{}else{} (아래 코드 참조)과 함께 사용하려고 시도했지만 문자 그대로 변경되지 않았습니다. 나는 그것이 효과가있을 것이라고 생각했고, 빈 엽상에 그냥 튀어 오르는 아이디어로 괜찮습니다. 내가 할 수있는 뭔가가 있습니까?

오류 :

Error: parse error: premature EOF 

        (right here) ------^ 

Warning: Error in : parse error: premature EOF 

        (right here) ------^ 

Stack trace (innermost first): 
    96: parse_string 
    95: parseJSON 
    94: fromJSON_string 
    93: jsonlite::fromJSON 
    92: ebird_GET 
    91: ebirdnotable 
    90: <reactive:APIdata> [/Users/Guest/Desktop/eBirdRarity/app.R#41] 
    79: APIdata 
    78: func [/Users/Guest/Desktop/eBirdRarity/app.R#68] 
    77: origRenderFunc 
    76: output$myMap 
    1: runApp 

코드 :

library(shiny) 
library(shinydashboard) 
library(shinythemes) 
library(leaflet) 
library(leaflet.extras) 
library(rebird) 

ui <- bootstrapPage(

    theme = shinytheme("superhero"), 

    # Setting map to full-screen 
    tags$style(type="text/css", "html, body {width:100%;height:100%}"), 

    # Initializing leaflet output 
    leafletOutput("myMap", width="100%", height="100%"), 

    # Adding title overlayed on leaflet map 
    absolutePanel(top = 1, left = 50, draggable = T, 
        titlePanel("eBird Recent Rarities Viewer")), 

    # Adding slider input overlayed on leaflet map 
    absolutePanel(bottom = 1, left = 45, draggable = T, 
        sliderInput("slider_in", "Days Back", min = 1, max = 30, value = 14, round = T)), 

    # Adding text input overlayed on leaflet map 
    absolutePanel(top = 1, right = 45, draggable = T, 
        textInput("region_in", "Region Code", value = "US-MA", placeholder = "US-MA")) 
) 

server <- function(input, output) { 

    # Rendering data frame from API with slider input 
    APIdata <- reactive({ 

    # Initial fetch of data from eBird API 
    a <- ebirdnotable(region = as.character(input$region_in), back = as.numeric(input$slider_in)) 

    # Changing review status from logical to numeric 
    cols <- sapply(a, is.logical) 
    a[,cols] <- lapply(a[,cols], as.numeric) 

    # Initializing new date column 
    a["date"] <- format(strptime(a$obsDt, format = "%Y-%m-%d"), "%b %d") 

    # Initializing new color grouping column 
    a["group"] <- NA 

    # Assigning colors by review status 
    idx<- (a$obsReviewed == 0) # Not reviewed 
    a$group[idx] <- "white" 
    idx<- (a$obsReviewed == 1) & (a$obsValid == 1) # Reviewed and accepted 
    a$group[idx] <- "green" 

    # Jittering lat/lon points to fix point overlap 
    a$lat = jitter(a$lat, factor = 3) 

    # print(a) 
    return(a) 
    }) 

    # Leaflet map 
    output$myMap = renderLeaflet({ 
    if(is.null(APIdata())) 
    { 
     # Rendering leaflet map 
     return(leaflet() %>% addTiles()) %>% 
     addSearchOSM(options = searchOSMOptions(zoom = 8)) 
    } 
    else 
    { 
     # Splitting up by review status in order to show reviewed on top 
     notReviewed = APIdata()[APIdata()$group == "white",] 
     accepted = APIdata()[APIdata()$group == "green",] 

     # Rendering leaflet map 
     leaflet() %>% addTiles() %>% 
     addCircleMarkers(data = notReviewed, color = "white", opacity = 0.7, label = paste(notReviewed$comName,", ",notReviewed$date, ", ", notReviewed$locName,sep = "")) %>% # , labelOptions = labelOptions(noHide = F, direction = 'auto')) %>% 
     addCircleMarkers(data = accepted, color = "green", opacity = 0.7, label = paste(accepted$comName,", ",accepted$date, ", ", accepted$locName, sep = "")) %>% # , labelOptions = labelOptions(noHide = F, direction = 'auto')) %>% 
     addLegend(position = "bottomright", 
        colors = c("#FFFFFF", "#008000"), 
        labels = c("Not reviewed", "Accepted"), 
        title = "Legend: review status", opacity = 1) %>% 
     addSearchOSM(options = searchOSMOptions(zoom = 8)) 
    } 
    }) 
} 

# Run the application 
shinyApp(ui = ui, server = server) 
+0

api로 가기 전에 입력 내용의 유효성을 검사하지 않으시겠습니까? 사용자가 잘못된 데이터를 제출하도록 허용하는 이유는 무엇입니까? – Elin

답변

1

당신이 값 또는 당신이 경우 tibble 받고하는 경우가 바로 확인할 수있다 점점 빈 tibble. tibble이 비어있는 경우 NULL을 반환 할 수 있습니다. 이렇게하면 APIdata()NULL인지 확인하기 위해 추가 한 유효성 검사가 작동합니다.

a <- ebirdnotable(region = as.character(input$region_in), back = as.numeric(input$slider_in)) 다음에 if(length(a) == 0){return(NULL)}을 추가하면 사후 대응할 수 있습니다.

편집 : 당신은 당신이 실제로 여기 try을 사용할 수 있습니다 귀하의 코멘트에서 언급 한 바와 같이

. 위의 조건 외에 코드를 추가하면 다음과 같은 조건이 추가됩니다.

a <- try(ebirdnotable(region = as.character(input$region_in), back = as.numeric(input$slider_in))) 
      if(class(a) == "try-error" ||length(a) == 0){return(NULL)} 

희망이 있습니다.

+0

고마워요! 좋은 생각이야. 나는 그 라인을 포함 시켰지 만, 어떤 유형의 입력에 대해서는 실제로 여전히 오류를 던진다. 예를 들어, "US-M"("A"삭제) 또는 "US-"를 입력하면 원하는 내용을 수행하여 빈 전단지로 튀어 나오게됩니다. 하지만 "U"로 다시 삭제하면 '조기 EOF'이전과 같은 오류가 발생합니다. 빈 스크립트 문서를 체크하고, 일부 입력에서 정확한 에러를 출력하는'ebirdnotable()'을 체크했습니다. 그러나 여전히 0x0을 출력합니다. – Heliornis

+0

여기서'tryCatch()'를 구현할 수 있습니까? 나는 전에 그것을 사용하지 않았다. – Heliornis

+0

@Heliornis 당신 말이 맞아요, 여기에서 시도해 볼 수 있습니다. 나는 코드를 편집했다. – SBista