2016-04-12 15 views
1

我想在閃亮使用validate(),但我每次驗證命令發現錯誤時不斷遇到問題。我試圖繪製偶爾某些子類別的數據可能沒有任何值的情況(即,如果類別是顏色,則可以選擇「綠色」,但有時數據集不會包含類別「綠色」中的任何行)。R閃亮與驗證:繪圖只調整大小窗口後刷新

每當我驗證的條件恢復爲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) 

僅供參考我使用的閃亮版本0.13.1,R版本3.2.3

回答

1

問題是input$color被包裹在isolateneed聲明。所以need仍然認爲你選擇了錯誤的顏色,因爲沒有任何東西告訴它重新檢查input$color。如果您添加input$go作爲您的renderPlot的第一行(就在validate之前),我認爲它可以滿足您的要求。

+0

這樣做可以修復它,但我喜歡使用隔離語句,以便在按下「更新」按鈕之前顏色不會更改。任何想法爲什麼調整窗口的大小是觸發這種情況下的變化,而不僅僅是更新按鈕? – Peter

+0

您可以保留'isolate'只需添加按鈕的輸入,以便觸發繪圖。我的猜測是,當你調整大小時,閃亮必須重新構圖,所以它運行'renderPlot',然後重新評估'validate'。 –

+0

輝煌!謝謝,我沒有意識到你可以把actionbutton放在renderplot裏面。 – Peter

相關問題