2016-04-19 12 views
0

スコープ上で光沢のあるヘルプarticleを通過しましたが、global object hereの設定に関する回答もあります。しかし、私がしなければならないこと(私が思うもの)については言及していません。出力関数内に変数しか作成されていない場合は、を別の変数で見ることはできますか?アクションボタンを使用して、私は長い計算を制御しようとしていますが、いくつかは他のことが起こっている状態でのみ起こります。最小の例として、出力関数間のスコープ

library(shiny) 
library(stringr) 

fruitref <- c("apple","peach","pear","plum","banana","kiwi") 
textareaInput <- function(inputID, label, value="", rows=10, columns=30) { 
    HTML(paste0('<div class="form-group shiny-input-container"> 
       <label for="', inputID, '">', label,'</label> 
       <textarea id="', inputID, '" rows="', rows,'" cols="', 
       columns,'">', value, '</textarea></div>')) 
} 
ui <- fluidPage(titlePanel("minimal example"), 
     sidebarLayout(
      sidebarPanel(
      textareaInput("inputfruit", "Enter some fruits:"), 
      actionButton("checkfruit", "Check fruits"), 
      verbatimTextOutput("fruitstat") 
     ), 
      mainPanel(
      textOutput("fruits") 
     ) 
     ) 
) 
server <- function(input,output){ 
    flag <- F 
    inputs <- eventReactive(input$checkfruit,{input$inputfruit}) 
    continue <- reactive(flag) 
    output$fruitstat <- renderText({ 
    inputs <- inputs() 
    inputs <- str_trim(unlist(strsplit(inputs,split="\n")),side="both") 
    if(length(setdiff(inputs,fruitref)) != 0 | length(inputs) == 0){ 
     flag <- F 
     paste(paste(setdiff(inputs,fruitref), collapse=", "),"not in table.") 
    } else { 
     flag <- T 
     "All fruits ok." 
    } 
    }) 
    output$fruits <- renderText({ 
    paste("Continue? ",continue()) 

    }) 
} 
shinyApp(ui = ui, server = server) 

参照テーブルがあり、そのテーブルに対してユーザー入力が確認されています。ユーザーは、チェックボタンを押すまでリストを入力し、すべてがOKかどうか、または不一致があるかどうかのフィードバックを取得します。すべてが大丈夫ならば、私は続行したい。私は出力関数で "continue"フラグを設定しようとしましたが、それはうまくいかず、出力関数の外のサーバーで値を更新しませんでした。私はまた、サーバー関数で環境を作成してassignを使用してみましたが、あとでrenderTextの値を取得しようとしたときに値を更新しませんでした。入力$でアクセスできる入力ではないので、私は更新*機能を使用できないと考えました。

これは、この種の条件を設定する最良の方法ではありません。私はチュートリアルで条件付きペインを見ましたが、それは関数で作成されたものではなく、入力に依存します。より一般的には、出力関数にはもっと複雑なオブジェクトが作成されます(4つの大きなテーブルとプロットがありますが、すべてまたは一部のサブセットが実際に出力されます)、他の出力関数には表示されるはずです。後のことが起こるまで計算することができないので、それらを反応的なグローバルオブジェクトと定義することができます。

答えて

1

eventReactiveとしてcontinueを定義します。

continue <- eventReactive(input$checkfruit, flag) 

そしてまた、それは動作します関数内

 flag <<- F 
     flag <<- T 

をグローバル代入演算子を使用します。テスト済み。