2016-07-29 4 views
0

renderUI 위젯에서 일부 입력을 호출 할 때 반응식이 여러 번 평가되는 상황이 나타났습니다.R 반응성 표현의 반짝이는 반복적 인 평가

다음 간단한 코드를 확인하십시오. 당신이 당신의 콘솔에서 살펴 경우

library(shiny) 


server <- function(input, output) { 
    output$INPUT_1 = renderUI({ 
    selectInput("input_1","Input 1",choices = letters) 
    }) 
    output$INPUT_2 = renderUI({ 
    selectInput("input_2","Input 2",choices = letters) 
    }) 
    output$INPUT_3 = renderUI({ 
    selectInput("input_3","Input 3",choices = letters)  
    }) 
    output$INPUT_4 = renderUI({ 
    selectInput("input_4","Input 4",choices = letters)  
    }) 


    output$text = renderText({ 
    print("1") 
    paste(input$input_1,input$input_2,input$input_3,input$input_4) 
    }) 

} 

ui <- fluidPage(
    uiOutput("INPUT_1"), 
    uiOutput("INPUT_2"), 
    uiOutput("INPUT_3"), 
    uiOutput("INPUT_4"), 
    textOutput("text") 
) 

shinyApp(ui = ui, server = server) 

, 당신은 "1"두 번왔다

Listening on http://127.0.0.1:4939 
[1] "1" 
[1] "1" 

를 볼 수 있습니다.

내 응용 프로그램에 "1"이 3 번 이상 올 수 있습니다. 내 반응이 큰 데이터를 다룰 때마다 이런 종류의 시나리오는 내 사용자와 나 자신을 당혹스럽게 만듭니다.

저는 이것이 renderUI 기능과 관련이 있다고 확신합니다. 그러나 나는 그것을 고칠 수있는 방법을 찾을 수 없다. updateXXXXX 기능 사용을 고려했지만 입력 UI에는 매우 복잡한 계산이 포함되어 있습니다. 그래서 updateXXXXX를 사용하는 것은 피하려고 노력하고 있습니다.

내 반응식은 한 번만 평가할 수 있습니까?

+0

반응식은 (연결된) 요소가 변경 될 때마다 평가됩니다. 그래서 서버는 앱이로드되고 모든 입력이 비어있을 때 평가됩니다. 반응적인 UI 요소가 채워지고 인쇄물이 다시 평가됩니다. (예를 들어 출력 $ text에 if (length (input $ input_1)> 0) print ("1")을 추가하십시오. – Arcoutte

답변

1

Shiny에는 서버 편성 호출 중에 일부 컨트롤 요소가 즉석에서 렌더링 되더라도 관찰자의 실행을 제어하는 ​​데 도움이되는 req이라는 추가 기능이 있습니다.

전체 설명서는 this page here을 참조하십시오. 즉, 반응 환경 (관찰자, 반응 값 또는 렌더링 함수) 내에서 일련의 입력 변수를 나열 할 수 있으며이 반응 환경은 ​​모든 입력 변수에 값이 할당 될 때까지 계산/실행되지 않습니다. 귀하의 경우에는

, 당신은 당신의 관찰자에게 줄

req(input$input_1, input$input_2,input$input_3, input$input_4) 

을 추가 할 수 있으며 한 번만 실행됩니다. (귀하의 게시물에 Arcoutte 님의 댓글에 명시된 이유로 2 번 실행되었습니다.)

아래의 샘플 코드를 작성하십시오.

library(shiny) 

server <- function(input, output) { 
    output$INPUT_1 = renderUI({ 
    selectInput("input_1","Input 1",choices = letters) 
    }) 
    output$INPUT_2 = renderUI({ 
    selectInput("input_2","Input 2",choices = letters) 
    }) 
    output$INPUT_3 = renderUI({ 
    selectInput("input_3","Input 3",choices = letters)  
    }) 
    output$INPUT_4 = renderUI({ 
    selectInput("input_4","Input 4",choices = letters)  
    }) 


    output$text = renderText({ 
    req(input$input_1,input$input_2,input$input_3,input$input_4) 

    print("1") 
    paste(input$input_1,input$input_2,input$input_3,input$input_4) 
    }) 

} 

ui <- fluidPage(
    uiOutput("INPUT_1"), 
    uiOutput("INPUT_2"), 
    uiOutput("INPUT_3"), 
    uiOutput("INPUT_4"), 
    textOutput("text") 
) 

shinyApp(ui = ui, server = server) 
+0

고마워요. 그것은 내 문제를 완벽하게 해결했습니다. – John