2016-04-12 23 views
1

Shiny'te validate() işlevini kullanmaya çalışıyorum ancak doğrulama komutunun her hata vermesi durumunda bir sorunla karşılaşıyorum. Bazen bazı alt kategorilerinde herhangi bir değerin bulunmadığı bir nokta çizmeye çalışıyorum (örneğin, renkler renklerse, "yeşil" yi seçebilirsiniz, ancak bazen veri kümesi "yeşil" kategorisinde hiç satır içermez).R Doğrulama ile parlak: Yalnızca yeniden boyutlandırıldıktan sonra çizim artar

Doğrulama yaptığım durum yanlış olduğunda geri döndüğünde hata mesajı doğru şekilde yazdırılıyor. Ancak, daha sonra yeni bir değer ve güncellemeyi yeniden seçtiğimde, yeni çizim sadece "update" i tıkladıktan sonra normalde görüneceği gibi, pencereyi elle yeniden boyutlandırdıktan sonra görünür.

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) 

Bilginize ben Parlak versiyon 0.13.1, R versiyonu 3.2.3

cevap

1

sorunu input$color sizin need açıklamada isolate sarılı olmasıdır kullanıyorum. Yani need hala yanlış rengi seçtiğini düşünüyor, çünkü hiçbir şey input$color numaralı telefonu yeniden kontrol etmeyi söylüyor. input$go'u renderPlot'un ilk satırı olarak eklerseniz (validate'dan hemen önce) istediğini yapar.

+0

Bu düzeltme, ancak "update" düğmesine basana kadar renkler değişmeyecek şekilde isolate deyimine sahip olmayı seviyorum. Pencerenin yeniden boyutlandırılması, yalnızca güncelleme düğmesinin tersine, bu durumda değişimin neyi tetiklediğiyle ilgili bir fikriniz var mı? – Peter

+0

'İzolatı 'sadece, girişin tetikleneceği şekilde düğmeyi girdiden tutabilirsiniz. Tahminimce yeniden boyutlandırdığınız zaman, parıltının çizimi yeniden yapılandırması gerekiyor, bu yüzden renderPlot'unu çalıştırıyor ve ardından validate yeniden değerlendiriliyor. –

+0

Parlak! Teşekkürler, actionbuttonun renderplot içerisine koyabileceğinin farkında değildim. – Peter