2017-03-21 9 views
3

selectInput() 값을 기반으로 checkboxGroupInput()을 업데이트하는 Shiny 앱을 빌드하고 있습니다. 또한 입력 값을 다시 선택할 때마다 동일하게 표시되도록 선택/선택 취소 된 값을 저장하려고합니다. 이렇게하려면 선택 값을 저장하기 위해 반응 값을 사용하고 있습니다.R updateCheckboxGroupInput() 및 selectinput()을 사용하여 캐시 된 값

여기 장난감 예제 : 대부분의 경우

library(shiny) 

letters = c('A','B','C','D','E','F','G','H','I','J','K','L') 

words = list("A" = c("apples","aardvark","alabama"), 
       "B" = c("banana","baltimore","beehive"), 
       "C" = c("catastrophe","cantalope"), 
       "D" = c("dinosaur","dairy","dolphin"), 
       "E" = c("eager","elephant","ecumenical"), 
       "F" = c("fleming","florida","flight"), 
       "G" = c("gator","greater","gait"), 
       "H" = c("HI"), 
       "I" = c("igloo","ignominious","interesting"), 
       "J" = c("jogging","jumpsuit"), 
       "K" = c("kellog","kangaroo"), 
       "L" = c("lemon","lime","lemonjello")) 


ui <- fluidPage(

    selectInput("letter","Choose Letter",choices=letters,selectize=F), 

    # Initiate check box group 
    checkboxGroupInput('words_by_letter',label='Select Your Favorite Words',choices = c(1)) 

) 


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

    v_selected <- reactiveValues(
     "A" = c("apples","aardvark","alabama"), 
     "B" = c("banana","baltimore","beehive"), 
     "C" = c("catastrophe","cantalope"), 
     "D" = c("dinosaur","dairy","dolphin"), 
     "E" = c("eager","elephant","ecumenical"), 
     "F" = c("fleming","florida","flight"), 
     "G" = c("gator","greater","gait"), 
     "H" = c("HI"), 
     "I" = c("igloo","ignominious","interesting"), 
     "J" = c("jogging","jumpsuit"), 
     "K" = c("kellog","kangaroo"), 
     "L" = c("lemon","lime","lemonjello")) 

    observeEvent(input$letter,{   
    updateCheckboxGroupInput(session, 
     inputId = "words_by_letter", 
     choices = words[[input$letter]], 
     selected = v_selected[[input$letter]]) 

    }) 

    observeEvent(input$words_by_letter,{ 
    v_selected[[input$letter]] = input$words_by_letter 
    }) 

} 


shinyApp(ui = ui, server = server) 

이 잘 작동합니다. 그러나 (화살표 버튼을 누른 채로) 입력을 빠르게 스크롤하면 결국 일부 체크 박스 그룹이 선택 취소됩니다. 나는 이것이 Javascript와의 반응성 및 의사 소통의 속도와 관련이 있다고 가정하고 있지만, 그것을 고치는 방법을 모른다.

참고 : 각 '문자'에 대해 별도의 조건부 패널을 사용해 보았습니다.하지만 내 앱의로드 시간이 크게 늘어나므로이 전략을 사용하지 않는 것이 좋습니다.

+0

경쟁 조건 : 그것은 가치가 무엇인지에 대한

library(shiny) letters = c('A','B','C','D','E','F','G','H','I','J','K','L') words = list("A" = c("apples","aardvark","alabama"), "B" = c("banana","baltimore","beehive"), "C" = c("catastrophe","cantalope"), "D" = c("dinosaur","dairy","dolphin"), "E" = c("eager","elephant","ecumenical"), "F" = c("fleming","florida","flight"), "G" = c("gator","greater","gait"), "H" = c("HI"), "I" = c("igloo","ignominious","interesting"), "J" = c("jogging","jumpsuit"), "K" = c("kellog","kangaroo"), "L" = c("lemon","lime","lemonjello")) ui <- fluidPage( selectInput("letter","Choose Letter",choices=letters,selectize=F), # Initiate check box group checkboxGroupInput('words_by_letter',label='Select Your Favorite Words',choices = c(1)) ) server <- function(input, output, session) { v_selected <- reactiveValues( "A" = c("apples","aardvark","alabama"), "B" = c("banana","baltimore","beehive"), "C" = c("catastrophe","cantalope"), "D" = c("dinosaur","dairy","dolphin"), "E" = c("eager","elephant","ecumenical"), "F" = c("fleming","florida","flight"), "G" = c("gator","greater","gait"), "H" = c("HI"), "I" = c("igloo","ignominious","interesting"), "J" = c("jogging","jumpsuit"), "K" = c("kellog","kangaroo"), "L" = c("lemon","lime","lemonjello")) observeEvent(input$letter,{ v_selected$last <- input$letter updateCheckboxGroupInput(session, inputId = "words_by_letter", choices = words[[input$letter]], selected = v_selected[[input$letter]]) }) overwriteIfConsistent <- function(selector,newvals,initwords){ # only overwrite if the new values are int the initial list initwords1 <- initwords[[selector]] truthvek <- newvals %in% initwords1 # are the newvals in this list? if (sum(truthvek)==length(newvals)){ # need them all to be true v_selected[[selector]] = newvals # ok, then overwrite } } observeEvent(input$words_by_letter,{ overwriteIfConsistent(input$letter,input$words_by_letter,words) }) } shinyApp(ui = ui, server = server) 

는이 앱이 모습입니다 : 여기

는 코드입니다. 단단한. 몇 가지 시도했지만 주위를 얻을 수 없습니다. –

+0

내 대답에 대한 의견이 있으십니까? –

+0

지연에 대해 사과드립니다. 나는 당신의 아이디어가 기존의 카테고리와 비교해보기를 좋아한다. 나는 이제 그것을 시험 할 기회를 얻고있다. 곧 업데이트를 보낼 것이다. – emitchell

답변

2

이것은 경쟁 조건 인 것처럼 보입니다. input$letter은 shinyServer가 너무 빨리 업데이트되고 계속 일치하지 않는 데이터로 반응 상태를 업데이트하려고 시도합니다. 예를 들어, "I"단어를 "J"선택 사항으로 덮어 쓰고 입력 선택기가 더 이상 작동하지 않습니다. 근본 원인이 쉽게 고쳐지지 않는다고 생각합니다.

그러나 input$letterinput$words_by_letter에있는 값이 일치하는 경우에만 반응 상태를 업데이트하는 것이 좋습니다.

실제 데이터에 따라 작동하지 않을 수도 있습니다. 테스트 할 수있는 일관성 조건이 있도록 데이터를 구성하고 업데이트를 보호해야합니다. 여기에있는 장난감 예에서는 선택한 단어를 내가 선택한 단어와 비교할 수 있습니다.

나는 input$words_by_letter에 일치하는 단어의 첫 글자를 비교할 수 있었지만 너무 특별하다고 보았습니다. 이렇게하면 선택한 데이터를 선택 초기화와 비교하는 것이 일반화 될 가능성이 큽니다.

enter image description here

+0

위대한 작품! 나는 당신의 함수와 observeEvent를 하나의 observeEvent에 결합하는 것을 끝내었다 - 함수 부분을 분리하는 이점이 있는가? – emitchell

+0

아니요, 단일 'observeEvent'처럼 명확합니다. –