2017-12-15 10 views
0

데이터 세트에서 ARIMA 모델링을 실행하고 결과를 그래프 및 텍스트 요약 형태로 표시하는 Shiny 앱을 개발 중입니다. 출력은 사용자가이 모델이 실행될 데이터 세트에서 오브젝트를 선택할 수 있어야한다는 점에서 대화식입니다.다른 함수에서 ggplot 입력을 반환하지 않는 빛나는 반응

Server.R 코드 -

server <- function(input, output) { 
    my_data <-fread("Branch_Final_Cleaned.csv") 

    myreactive_plot<-reactive({ 
    get_my_plot(input$select_ID, my_data) 

    }) 

    output$branch_regression_plot <- renderPlot({ 
    myreactive_plot() 
    }) 
} 

"select_ID는"사용자가 데이터베이스에서 개체를 선택하게됩니다 입력 변수입니다. 이를 식별하는 기본 키는 ID입니다. "select_ID"를 참조

ui.R 코드 -

selectInput(
        inputId = "select_ID", 
        "Select Branch ID", 
        selected = "106841", 
        sort(unique(branch$ID)) 
       ) 

주 : 분기 $ ID는 I가 회귀를 실행 데이터 세트의 단지 사본입니다. branch $ ID는 기본 키 (ID)로 사용자가 "select_ID"입력을 선택하는 드롭 다운 목록을 채우기 만합니다.

데이터 조작, 회귀 및 플로팅은 사용자 정의 함수에서 수행됩니다. 아래에 -

get_my_plot <- function(id, branch_analysis) { 

    branch_analysis <- fread("Branch_Final_Cleaned.csv") 
    data_branch_analysis <- data.table(branch_analysis) 

    data_branch_analysis<-(data_branch_analysis[ID==id])[order(DATE)] 
    data_branch_analysis[,NDATE:=as.Date(DATE,"%Y.%m.%d")] 
    data_branch_analysis[,L_AVG_AGE:=shift(AVG_AGE,1)] 
    data_branch_analysis[,L_AVG_WAGE:=as.numeric(shift(AVG_WAGE,1))] 
    data_branch_analysis[,WD:=format.Date(NDATE,"%a")] 
    data_branch_analysis[,time:=as.numeric(NDATE-min(data_branch_analysis$NDATE))] 
    data_branch_analysis[is.na(AGE_0_17),AGE_0_17:=0] 
    data_branch_analysis[is.na(AGE_18_25),AGE_18_25:=0] 
    data_branch_analysis[is.na(AGE_26_35),AGE_26_35:=0] 
    data_branch_analysis[is.na(AGE_36_45),AGE_36_45:=0] 
    data_branch_analysis[is.na(AGE_46_55),AGE_46_55:=0] 
    data_branch_analysis[is.na(AGE_56_65),AGE_56_65:=0] 
    data_branch_analysis[is.na(AGE_66_99),AGE_66_99:=0] 
    data_branch_analysis[is.na(W3_7),W3_7:=0] 
    data_branch_analysis[is.na(W7_14),W7_14:=0] 
    data_branch_analysis[is.na(W14_21),W14_21:=0] 
    data_branch_analysis[is.na(W21_99),W21_99:=0] 
    data_branch_analysis[,L_AGE_0_17:=shift(AGE_0_17,1)] 
    data_branch_analysis[,L_AGE_18_25:=shift(AGE_18_25,1)] 
    data_branch_analysis[,L_AGE_26_35:=shift(AGE_26_35,1)] 
    data_branch_analysis[,L_AGE_36_45:=shift(AGE_36_45,1)] 
    data_branch_analysis[,L_AGE_46_55:=shift(AGE_46_55,1)] 
    data_branch_analysis[,L_AGE_56_65:=shift(AGE_56_65,1)] 
    data_branch_analysis[,L_AGE_66_99:=shift(AGE_66_99,1)] 
    data_branch_analysis[,L_W3_7:=shift(W3_7,1)] 
    data_branch_analysis[,L_W7_14:=shift(W7_14,1)] 
    data_branch_analysis[,L_W14_21:=shift(W14_21,1)] 
    data_branch_analysis[,L_W21_99:=shift(W21_99,1)] 

    fit1<-lm(data=data_branch_analysis,VISITOR_NUM~0+time+WD+L_W3_7+L_W7_14+L_W14_21+L_W21_99+L_AVG_AGE+L_AVG_WAGE+L_AGE_0_17+L_AGE_18_25+L_AGE_26_35+L_AGE_36_45+L_AGE_46_55+L_AGE_56_65+L_AGE_66_99) 
    bestm<-step(fit1, trace = FALSE) 

    ntrain=199 

    data_branch_analysis_train<-head(bestm$model,ntrain) 

    data_reg<-copy(data.table(bestm$model)) 
    data_reg[,MON:=ifelse(WD=="Mon",1,0)] 
    data_reg[,TUE:=ifelse(WD=="Tue",1,0)] 
    data_reg[,WED:=ifelse(WD=="Wed",1,0)] 
    data_reg[,THU:=ifelse(WD=="Thu",1,0)] 
    data_reg[,FRI:=ifelse(WD=="Fri",1,0)] 
    data_reg$WD<-NULL 
    data_reg$VISITOR_NUM<-NULL 
    x_reg<-head(data_reg,ntrain) 


    fit2<-auto.arima(data_branch_analysis_train$VISITOR_NUM,max.order=30,xreg=as.matrix(x_reg)) 


    #nrow(data_branch_analysis)-(ntrain+1) 
    new_x<-tail(data_reg,nrow(data_branch_analysis)-(ntrain+1)) 
    fore2<-forecast(fit2,xreg=as.matrix(new_x)) 

    g <- 
    ggplot()+geom_line(aes(x=data_branch_analysis$NDATE,y=data_branch_analysis$VISITOR_NUM,col="original"))+ 
    geom_line(aes(x=data_branch_analysis$NDATE[2:(ntrain+1)],y=fit2$fitted,col="train"))+ 
    geom_line(aes(x=data_branch_analysis$NDATE[(ntrain+2):nrow(data_branch_analysis)],y=fore2$mean,col="test")) 

    return(g) 

} 

이제 get_my_plot 함수는 개별적으로 실행될 때 ggplot을 반환합니다. 그러나 앱 자체를 실행할 때 출력이 표시되지 않습니다. 여기서 무엇을 할 수 있습니까?

또한 get_my_plot 함수에서 ggplot 그래프를 반환하면서 텍스트 출력을 반환 할 수 있습니까? 회귀 모델에 대한 요약()과 정확도()를 반환하고 싶습니다. 그렇다면 서버에서 textOutput 호출을 개별적으로 참조 할 수 있습니까?

감사합니다.

+0

"기계 학습"또는 "인공 지능"과 관련하여 어떤 질문이 있습니까? – PoGibas

+0

'get_my_plot (입력 $ select_ID, my_data)'? –

+0

@PoGibas 강조 표시 해 주셔서 감사합니다. 그들을 제거했습니다. 건배. –

답변

0

다른 문제는 다른 종류의 요소 목록을 반환하면 해결할 수 있습니다.

return(list(g, 
      summary(fit1), 
      summary(fit2), 
      accuracy(fit1), 
      accuracy(fit2) 
    ) 

그리고 서버 부분의 인덱스로 개별적으로 호출하십시오. 예 :

myreactive_plot <- reactive({ 
    get_my_plot(input$select_ID, my_data)[[1]] 
    }) 

myreactive_fit1_summary <- reactive({ 
    get_my_plot(input$select_ID, my_data)[[2]] 
    }) 
+0

이것은'get_my_plot'을 여러 번 재실행 할 것입니다.'auto.arima'의 결과로'reactive'를 생성 한 다음 다른 출력에 대해 post-process를 만드는 것이 더 효율적일 수 있습니다. – daroczig