2017-12-13 32 views
1

앱이 시작될 때 트리거되는 observeEvent의 앱이 있는데 버튼을 클릭 할 때까지 기다리지 않습니다. 이 예제에서는 차이가없는 것처럼 보이지만 실제 앱에서는 busyIndicator가 초기로드에서 두 번 표시됩니다. SEND는 { "중": "사용 중"} 보내기 { "중": "유휴"}앱 실행시 반짝이는 observeEvent 트리거

name<-sample(c('a','b','c'),replace=T,5) 
LAT<-runif(5,min=-26, max=-22) 
LONG<-runif(5,min=-54, max=-48) 
data<-data.frame(name,LAT,LONG) 

ui <- shinyUI(fluidPage(
    selectInput('muni',label='Select city', 
       choices=c('Show all',sort(levels(data$name)),selected=NULL)), 
    htmlOutput('box'), 
    leafletOutput('map') 
)) 

server <- function (input, output, session) { 

data1<-reactive({ 
     if (input$muni!='Show all') { 
      data<-data[which(data$name==input$muni),] 
      } 
     return(data) 
}) 

output$box <- renderUI({ 

data<-data1() 
num<-as.integer(nrow(data)) 

lapply(1:num, function(i) { 
     bt <- paste0('go_btn',i) 
     fluidRow(
       HTML(paste0('<div style="border: 1px solid #00000026; 
       border-radius: 10px; padding: 10px;"> 
       <span style="font-size:14px font-weight:bold;">', 
       data$name[i],' - areas: a1, a2, a3</span></br>', 
       actionButton(bt,'See map',icon=icon('map-marker',lib='font-awesome')), 
       HTML('</div></br>') 
       ))) 
     }) 
    }) 

output$map<-renderLeaflet({ 

data<-data1() 
rownames(data)<-seq(1:nrow(data)) 

leaflet(data) %>% 
    addProviderTiles("Esri.WorldTopoMap") %>% 
    setView(-51.5,-24.8,zoom=7) %>% 
    addMarkers(lng=~data$LONG,lat=~data$LAT) 

}) 

lapply(1:nrow(data), function(i) { 
     observeEvent(input[[paste0('go_btn',i)]], { 
        data<-data1() 
        rownames(data)<-seq(1:nrow(data)) 

        leafletProxy('map',data=data,session=session) %>% 
           clearMarkers() %>% 
           setView(data$LONG[i],data$LAT[i],zoom=15) %>% 
           addMarkers(lng=data$LONG[i],lat=data$LAT[i]) 
     },ignoreInit = T) 
    }) 
    } 

    shinyApp(ui, server) 

내가 프로세스가 두 번 실행되는 것을 볼 수 options(shiny.trace = TRUE) 사용. 누군가 내 앱이이 동작을하는 이유를 말할 수 있습니까? 난 내 자신을 만들 수 있도록

+0

재현 가능한 예를 게시 할 수 있습니까? 코드에는 실행되지 못하게하는 몇 가지 문제가 있습니다. –

+0

죄송합니다! 데이터 프레임에서 일부 변수를 삭제하고 선언하지 않은 것을 잊었습니다! 이제 나는 그것이 효과가 있다고 생각합니다 ... –

답변

1

나는 당신의 예를 실행할 수 없습니다 :

library(shiny) 

options(shiny.trace = TRUE) 

ui <- shinyUI(fluidPage(
    uiOutput("content") 
)) 

server <- function (input, output, session) { 
    output$content <- renderUI({ 
    actionButton("btn", "Button") 
    }) 

    observeEvent(input$btn, { 
    print("btn") 
    }) 
} 

shinyApp(ui, server) 

이의 콘솔 출력은 다음과 같습니다

SEND {"config":{"workerId":"","sessionId":"1ceb44576d353c33bdc92e1eebba7ad0","user":null}} 
RECV {"method":"init","data":{".clientdata_output_content_hidden":false,".clientdata_pixelratio":1,".clientdata_url_protocol":"http:",".clientdata_url_hostname":"127.0.0.1",".clientdata_url_port":"5326",".clientdata_url_pathname":"/",".clientdata_url_search":"",".clientdata_url_hash_initial":"",".clientdata_url_hash":"",".clientdata_singletons":"",".clientdata_allowDataUriScheme":true}} 
SEND {"busy":"busy"} 
SEND {"recalculating":{"name":"content","status":"recalculating"}} 
SEND {"recalculating":{"name":"content","status":"recalculated"}} 
SEND {"busy":"idle"} 
SEND {"errors":[],"values":{"content":{"html":"<button id=\"btn\" type=\"button\" class=\"btn btn-default action-button\">Button<\/button>","deps":[]}},"inputMessages":[]} 
RECV {"method":"update","data":{"btn:shiny.action":0}} 
SEND {"busy":"busy"} 
SEND {"busy":"idle"} 

는 두 개의 "중"메시지가 있습니다. 첫 번째는 에서 eventExpr (이 때 NULL이므로 실행하지 않습니다. handlerExpr)입니다. ignoreInit = TRUE 일지라도 항상 eventExpr을 확인합니다. 두 번째 작업은 동적 UI의 초기 렌더링에서 비롯됩니다.

+0

반짝이는 것, 바쁘지 않은 것 그리고 바쁜 것의 정상적인 행동이기 때문에 적재 메시지를 두 번 보여주지 않는 것이 불가능합니까? observeEvent (input [[paste0 ('go_btn', i)]])를 제거하면 두 번 바쁜 것처럼 보이지 않습니다. –

+0

당신 말이 맞아요. 그 바쁜 메시지 중 하나가 옵저버로부터 왔고 나는 대답을 수정했습니다. 관찰자가 이벤트 표현이 진실인지 항상 확인하는 바쁜 메시지가있을 것입니다. 그러나 반드시 핸들러 표현식이 실행되는 것은 아닙니다. –