2016-07-29 18 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" が2回来た

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

が表示されます。

自分のアプリは「1」が3回以上出ています。私の反応が大きいデータを扱うので、この種のシナリオはユーザーと私自身を本当に困惑させます。

これは、renderUI機能と関係があります。しかし、私はまだそれを修正する方法を見つけることができません。私はupdateXXXXX機能の使用を検討しましたが、入力UIには非常に複雑な計算が含まれています。ですから、updateXXXXXを使用することは私が避けようとしていることです。

私の反応式は一度しか評価できないのですか?

+0

反応式は、(リンクされた)ui要素が変更されるたびに評価されます。したがって、アプリケーションが読み込まれ、すべての入力が空のときにサーバーが評価されます。反応的なUI要素が入力され、印刷が2度目に評価されるよりも、 (例えば、出力$ textにif(length(input $ input_1)> 0)print( "1")を追加します) – Arcoutte

答えて

1

シャイニーには、サーバー側の呼び出しで一部のコントロール要素がオンザフライでレンダリングされても、オブザーバの実行を制御するのに役立つ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

関連する問題