2017-03-21 12 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の単語の最初の文字をinput$letterと照合して使用できましたが、これはあまりにも特殊なようでした。この方法では、選択したデータを選択の初期化と比較することが一般化する可能性が高くなります。ここで

コードです:

enter image description here

+0

これは素晴らしいです!私はあなたの関数とobserveEventを1つのobserveEventに結合することになりました - 関数の部分を分離する利点はありますか? – emitchell

+0

いいえ、私はそれが単一の 'observeEvent'としても明白だと思います。 –

関連する問題