2017-12-12 13 views
0

私は何時間もこの問題を抱えてきました。私は実際のユースケースのより単純なバージョンを作成して、問題をデバッグできるかどうかを確認しようとしましたが、まだ問題があります。リアクティブループin R Shiny

私の光沢のあるアプリは以下の通りです。ユーザーからの入力を受け取り、しきい値を満たすまで計算を実行してから、リストに値を収集します。これはいくつかの反復(この例では10回)で行い、次にこれらの値のヒストグラムをプロットします。

私は取得しています特定のエラーが

Warning: Error in : evaluation nested too deeply: infinite recursion/options(expressions=)? 

を言う私は私のエラーは、私がx.newを使用している方法に関連していると思いますが、私は違っそれをコーディングする方法を見つけ出すことはできません。

# install.packages('shiny') 
library(shiny) 
ui <- fluidPage(
    headerPanel('Title Here'), 
    sidebarPanel(
    numericInput('x.qty', 'Pick a number', 3, 1, 10)), 
    mainPanel(plotOutput('valueplot')) 
) 

server <- function(input, output, session) { 
    results <- reactive({ 
    x.list <- list() 
    for (i in 1:10){ 
     x.new <- reactive({input$x.qty * sample(1:10, 1)}) 
     repeat{ 
     if (x.new() > 20){ 
      x.list <- c(x.list, x.new()) 
      results <- x.list 
      break 
     } # end if loop 
     x.new <- reactive({x.new() * sample(1:10, 1)}) 
     } # end repeat 
    } # end for loop 
    results 
    }) 
    output$valueplot <- renderPlot({hist(as.numeric(results()))}) 
} 

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

ここでの基本的な問題は、 'x.new()'が複数回定義された反応性であるため、光沢が何をすべきか分からないということです。おそらく反応変数を使用するか、2つの異なる名前を使用して、これを避けるためにこれを書き直せますか? –

+0

問題は自分自身を参照する必要があるということです。したがって、ユーザーは 'x.qty'に対して3を選択します...' x.new'は3に乱数...例えば2を掛けます。これは20を超えていないので、 'x.new'の新しい値を6にして、別の数値を乗算したい。 – pyll

答えて

1

よりも大きくなるまで再帰的に乱数によって自分自身を掛けrepeatループx.newで、その後x.qtyを使用して計算されます。

server <- function(input, output, session) { 
    results <- reactive({ 
    x.list <- list() 
    for (i in 1:10){ 
     x.new <- input$x.qty * sample(1:10, 1) 
     repeat{ 
     if (x.new > 20){ 
      x.list <- c(x.list, x.new) 
      results <- x.list 
      break 
     } # end if loop 
     x.new <- x.new * sample(1:10, 1) 
     } # end repeat 
    } # end for loop 
    results 
    }) 
    output$valueplot <- renderPlot({hist(as.numeric(results()))}) 
} 

あなたは

x.new <- reactive({x.new() * sample(1:10, 1)}) 
によって引き起こさ無限の再帰を避けるため、この方法210
+0

これは望ましい出力を持っており、もう一つの答えより少しきれいです。 – pyll

1

これは機能しますか?各forループ反復、x.newは私が次のようにサーバーの機能を変更することをお勧め20

library(shiny) 

ui <- fluidPage(headerPanel('Title Here'), 
       sidebarPanel(numericInput('x.qty', 'Pick a number', 3, 1, 10)), 
       mainPanel(plotOutput('valueplot'))) 

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

    x.new <- function(x) { 
    x * sample(1:10, 1) 
    } 

    results <- reactive({ 
    x.list <- list() 
    for (i in 1:10) { 
     x.new_draw <- x.new(input$x.qty) 
     repeat { 
     if (x.new_draw > 20) { 
      x.list <- c(x.list, x.new_draw) 
      break 
     } # end if loop 
     x.new_draw <- x.new(x.new_draw) 
     } # end repeat 
    } # end for loop 
    x.list 
    }) 
    output$valueplot <- renderPlot({ 
    hist(as.numeric(results())) 
    }) 

} 

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

はい!これはまさに私が探しているものと思われます。これがなぜ機能するのかを簡単に説明してください。 – pyll

+0

こんにちはごめんなさい。 'x.new'関数は単純に数値に乱数を掛けたので、反応する必要はありませんでした。私はそれを習慣として関数として使用しました。乱数生成を変更したい場合は、他の解と比較して1つの場所で変更するだけです。また、すでに 'x.list'に結果を蓄積しているので、このベクトルを' results'という名前のリアクティブ関数と混同する可能性があるので、これを 'results'にコピーする必要はありません。最後に 'x.list'を返すことができます – hrabel