2016-04-12 23 views
1

Shinyではvalidate()を使用しようとしていますが、検証コマンドでエラーが検出されるたびに問題が発生します。データの一部のサブカテゴリに値がない場合があります(つまり、カテゴリが色である場合は「緑色」を選択できますが、データセットにカテゴリ「緑色」の行が含まれない場合があります)。R Shiny with validate:プロットはウィンドウのサイズ変更後にのみリフレッシュされます

私が検証している条件がfalseになると、エラーメッセージが正しく出力されます。しかし、新しい値を再選択して更新すると、「更新」をクリックした後の通常の表示とは異なり、新しいプロットは手動でウィンドウのサイズを変更した後にのみ表示されます。

colors = c("green","blue","red") 
library(shiny) 

ui <- fluidPage(

    tabsetPanel(
    tabPanel("Info", 
      selectInput(inputId = "color",label = "color:", 
         choices = colors, 
         selected = colors[2], 
         multiple = FALSE), 
      actionButton(inputId = "go", 
          label = "Update"), 
      plotOutput("plot", width = "100%", height = 700, 
         brush = brushOpts(id = "plot_brush",fill = "green",clip = FALSE)) 

    ) 
) 
) 

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

    data = eventReactive(input$go, { 
    var1 = rnorm(20,5) 
    cat1 = (c(rep("red",10),rep("blue",10))) 
    data = cbind.data.frame(var1,cat1) 
    plotdata = data[which(data$cat1 ==isolate(input$color)),] 

    } 
) 

    output$plot = renderPlot({ 

    validate(
     need( (isolate(input$color) %in% c("red","blue")) , "No color of this type ") 
    ) 

    plotdata = data() 
    plot(plotdata$var1, col = isolate(input$color)) 
    }) 
} 

shinyApp(ui = ui,server = server) 

FYI私は光沢のあるバージョン0.13.1を使用している、Rバージョン3.2.3

答えて

1

問題がinput$colorがあなたのneed文でisolateに包まれているということです。だから、needは、あなたが間違った色を選択したと考えているのですが、何も再確認する必要がないので、input$colorです。 renderPlotの最初の行(validateの直前)にinput$goを追加すると、あなたが望むことができると思います。

+0

それは修正されていますが、「更新」ボタンを押すまで色が変わらないように分離ステートメントが好きです。ウィンドウのサイズ変更が、なぜ更新ボタンだけでなく、その場合の変更をトリガーするのか、 – Peter

+0

'isolate'を保つことができます。ボタンから入力を追加するだけで、プロットがトリガーされます。私の推測では、サイズを変更すると、shinyはプロットを再構成しなければならないので、 'renderPlot'を実行し、' validate'が再評価されます。 –

+0

Brilliant!ありがとう、私はあなたがrenderplotの中にアクションボタンを置くことができるとは思わなかった。 – Peter

関連する問題