2016-10-24 3 views
1

다음 최소 예제는 중첩 된 출력을 업데이트 한 다음 출력을 업데이트하기 전의 내용으로 입력을 업데이트하는 문제를 보여줍니다. 이 최소한의 예제는 훨씬 더 큰 프로젝트에서 나옵니다. 따라서 Shiny가 실제로 중첩 출력을 허용하지 않는 한 "출력을 중첩하지 마십시오"와 같은 문제에 대한 솔루션은 실행 가능하지 않습니다.중첩 된 출력으로 반짝이는 입력 업데이트가 실패합니다.

예제를 실행하면 두 개의 라디오 버튼과 텍스트 입력이 표시됩니다. 텍스트를 입력하고 라디오 버튼을 변경하십시오. 라디오 버튼 이벤트가 처리 된 후 텍스트 입력이 실제로 업데이트 된 것을 볼 수 있습니다. 그러나 라디오 버튼을 두 번째로 변경하면 observeEvent()에있는 텍스트 입력이 비어있게됩니다.

updateTextInput() 기능은 브라우저에서 보는 것을 업데이트하는 것처럼 작동하지만, 다음 이벤트의 입력에 대해 브라우저에서 Shiny가 다시 가져 오는 것과는 다릅니다.

이상한 것을 추가하려면 업데이트 된 텍스트 입력을 어떤 방식 으로든 변경 (예 : 한 문자를 추가 또는 삭제)하면 예상대로 작동합니다. 문제는 나의 코드, 나의 기대, 또는 반짝 반짝 빛나는 버그입니까?

ui <- fluidPage(fluidRow(column(12, tagList(
     uiOutput("outer_div") 
    )))) 

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

updateScreen = function() { 
    output$outer_div = renderUI(uiOutput("inner_div")) 
    output$inner_div = renderUI(tagList(
     radioButtons(inputId = "button", label="", choices = c("A", "B")), 
     textInput("text", label="", value="") 
    )) 
} 
updateScreen() #initialize screen 

    observeEvent(input$button, { 
     print(paste0("Text input is ", input$text)) 
     updateTextInput(session, inputId = "text" , value=input$text) 
     updateRadioButtons(session, inputId="button", selected=input$button) 
     updateScreen() 
    }) 

} 

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

아마도 '반짝 반짝 0.14'의 'insertUI'가 중첩 된 UI보다 나은 해결책입니다. –

+0

이 목표는 정확히 무엇입니까? 나는 몇 가지 해결책을 생각할 수 있지만 ... 나는 누군가의 시간을 낭비하지 않도록하고 싶다. –

+0

방금 ​​들었던 몇 가지. 라디오 그룹의 변경 사항에 대한 응답을 기반으로 텍스트 입력을 업데이트하려고합니다 ... 그러나 입력의 현재 값이 무엇이든간에 텍스트 입력을 업데이트하고 있습니다. 코드 실행을 올바르게 읽는다면 아무 것도 업데이트하지 않을 것입니다. 또한; 'print()'함수는 어디에서 cat'ing하고 있나? 또한; updateScreen ouside를 반응 적으로 호출 한 다음 다시 관찰자에서 호출하면 no를 생성 할 수 있습니까? –

답변

0

이 기능이 작동합니까?

ui <- fluidPage(fluidRow(column(12, tagList(
    uiOutput("outer_div") 
)))) 

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

    updateScreen = function() { 
    output$outer_div = renderUI(uiOutput("inner_div")) 
    output$inner_div = renderUI(tagList(
     radioButtons(inputId = "button", label="", choices = c("A", "B")), 
     textInput("text", label="", value="") 
    )) 
    } 
updateScreen() #initialize screen 


    data <- isolate(input$text) 
    observeEvent(input$button, { 
    updateTextInput(session, inputId = "text" , value=data) 
    updateRadioButtons(session, inputId="button", selected=input$button) 
    print(paste0("Text input is ", input$text)) 
    #updateScreen() 
    }) 

} 

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

실제 응용 프로그램에서는 외부 div와 내부 div 둘 다 어떤 라디오 버튼이 선택되었는지에 따라 다른 정보를 표시합니다.이 솔루션은'observeEvent' 내부의'updateScreen()'함수를 주석 처리하는 데 달려 있습니다. 표시됩니다. – 3D0G

관련 문제