2017-12-05 6 views
0

グラフをクリックして悪いデータポイントを削除するR Shinyスクリプトを作成しています。R Shiny actionButtonでデータ制限を調整する

目的#1:ユーザーがactionButtonをクリックして「下に削除」し、グラフ上のポイントをクリックします。この点はyminであり、Rはそれより小さいyの値をすべて削除します。 "Remove" =はNAと宣言します。

目的2:逆に、ユーザーがアクションボタン「上の削除」をクリックし、グラフ上のポイントをクリックします。この点はymaxであり、Rはそれより大きいyの値をすべて削除します。ここで

は、コードの簡易版である:それはあなたが(あなたがそれを実行しても、複数回)を実行し、すべてのかどう

library(shiny) 
x = seq(0,10,length=50) 
y = sin(x) 
picked.style = "color: white; background-color: black" 

ui = fluidPage(
    plotOutput("y.trimmed", click = "plot_click"), 
    actionButton(inputId="b.above.pushed", label="Delete Above"), 
    actionButton(inputId="b.below.pushed", label="Delete Below") 
) 

server = function(input, output) { 
    v <- reactiveValues(
    ymin = min(y, na.rm=T), 
    ymax = max(y, na.rm=T), 
    pick.bottun = "none" 
) 

    ############ push a button 
    # pick above 
    observeEvent(input$b.above.pushed, { 
    v$pick.bottun <- "above" 
    observeEvent(input$plot_click, 
    {v$ymax = input$plot_click$y}, ignoreInit = TRUE) 
    }) 
    # pick below 
    observeEvent(input$b.below.pushed, { 
    v$pick.bottun <- "below" 
    observeEvent(input$plot_click, 
    { v$ymin <- input$plot_click$y}, ignoreInit = TRUE) 
    }) 

    ############# update and replot data 
    output$y.trimmed <- renderPlot({ 
    # clean data 
    print(paste("ymin=",round(v$ymin), "ymax=",round(v$ymax))) 
    cc = y <= v$ymin & is.na(y)==F; y[cc] = NA 
    cc = y >= v$ymax & is.na(y)==F; y[cc] = NA 
    plot(x, y) 
    }) 
} 

shinyApp(ui, server) 

これまでのところ、それは客観#1のために正常に動作します。同様に、Objective#2でもうまく動作します。

yminを宣言してからymaxを宣言する場合に問題が発生します。 (ymin = 0.1と仮定しますが)ymaxを宣言する理由(仮説的にymax = 0.5)は、yminとymaxの両方を0.5に設定します。これにより、すべてのデータが削除され、コードがクラッシュします。最初にymaxを宣言してからyminを設定しようとすると、同じことが起こります。

ご協力いただきありがとうございます。

+0

これは、radioButtonまたはselectInputで解決するのがはるかに簡単だと思いますが、2つのactionButtonsも同様に受け入れられますか? –

+0

ありがとうございます。私は実際に両方のアプローチを採用しました(それぞれが私のアプリで便利です)。 – HSpeckman

+0

回答が参考になった場合は、それらを受け入れてください、そして/またはupvoteしてください。これにより、将来の読者が探しているものを見つけやすくなります。 –

答えて

0

observeEventを別のイベントに配置する必要はありません。あなたはいつもそれらをサーバ機能にきれいに置き、より価値のあるものが選択されたことに応じて反応するほうがよい。このような。

library(shiny) 
x = seq(0,10,length=50) 
y = sin(x) 
picked.style = "color: white; background-color: black" 

ui = fluidPage(
    plotOutput("y.trimmed", click = "plot_click"), 
    actionButton(inputId="b.above.pushed", label="Delete Above"), 
    actionButton(inputId="b.below.pushed", label="Delete Below") 
) 

server = function(input, output) { 
    v <- reactiveValues(
    ymin = min(y, na.rm=T), 
    ymax = max(y, na.rm=T), 
    pick.bottun = "none" 
) 

    ############ push a button 
    # pick above 
    observeEvent(input$b.above.pushed, { 
    v$pick.bottun <- "above" 
    }) 

    observeEvent(input$plot_click, 
       { 
       if(v$pick.bottun == "above"){ 
        v$ymax = input$plot_click$y 
       } else if(v$pick.bottun == "below"){ 
        v$ymin = input$plot_click$y 
       } 

       }, ignoreInit = TRUE) 
    # pick below 
    observeEvent(input$b.below.pushed, { 
    v$pick.bottun <- "below" 
    }) 

    ############# update and replot data 
    output$y.trimmed <- renderPlot({ 
    # clean data 
    print(paste("ymin=",round(v$ymin), "ymax=",round(v$ymax))) 
    cc = y <= v$ymin & is.na(y)==F; y[cc] = NA 
    cc = y >= v$ymax & is.na(y)==F; y[cc] = NA 
    plot(x, y) 
    }) 
} 

shinyApp(ui, server) 

関連する問題