2014-04-03 9 views
14

Arabirim, UI'nin yüklenmesinden önce göz önünde bulundurulduğu için bir sorunla karşılaşıyorum. İşte R parlak Çalıştırmayı gözlemleyin UI'nin yüklenmesinden önce ve bu durum Null parametrelerine neden olur

İşte benim Server.R

shinyServer(function(input, output,session) { 

    #this is dynamic UI 
    output$choose_Product <- renderUI({ 
    selectInput("Product", "Product:", as.list(getProductUI(input$Desk))) 
    }) 

    #this is dynamic UI 
    output$choose_File1 <- renderUI({ 
    selectInput("File1", "File 1:", as.list(getFileUI(input$Desk, input$Product))) 
    }) 

    #this is dynamic UI and I want it to run before the Observe function so the call 
    # to getTerm1UI(input$Desk, input$Product, input$File1) has non-null parameters 
    output$choose_Term1 <- renderUI({ 
    print("Rendering UI for TERM") 
    print(paste(input$Desk," ", input$Product, " ", input$File1,sep="")) 
    selectInput("Term1", "Term:", getTerm1UI(input$Desk, input$Product, input$File1)) 
    }) 

benim ui.R

sidebarPanel(
    selectInput("Desk", "Desk:" , as.matrix(getDesksUI())), 
    uiOutput("choose_Product"), #this is dynamically created UI 
    uiOutput("choose_File1"), #this is dynamically created UI 
    uiOutput("choose_Term1"), #this is dynamically created UI .... 

olan Bu benim işlevini gözlemlemek ve giriş $ Ürün ve girdi $ File1 böylece doldurulur önce çalıştırır Bir hata alıyorum çünkü ikisi de NULL. Fakat girişi UI'den kullanmam gerekiyor.

observe({ 
    print("in observe") 
    print(input$Product) 
    max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1)) 
    #max_plots<-5 
      # Call renderPlot for each one. Plots are only actually generated when they 
      # are visible on the web page. 
      for (i in 1:max_plots) { 
       # Need local so that each item gets its own number. Without it, the value 
       # of i in the renderPlot() will be the same across all instances, because 
       # of when the expression is evaluated. 
       local({ 
       my_i <- i 
       plotname <- paste("plot", my_i, sep="") 
       output[[plotname]] <- renderPlot({ 
        plot(1:my_i, 1:my_i, 
         xlim = c(1, max_plots), 
         ylim = c(1, max_plots), 
         main = paste("1:", my_i, ". n is ", input$n, sep = "")) 
       }) 
       }) 
      }##### End FoR Loop 
},priority = -1000) 

nasıl çalışır gözlemlemek ÖNCE doldurulması giriş $ Ürün ve girdi $ File1 almak için fikrin var mı?

Teşekkür ederiz.

+1

'observe'' priority = 0' argümanına sahiptir. Belli bir öncelik seviyesine sahip bir gözlemci, her zaman daha düşük öncelik seviyesine sahip tüm gözlemcilerden daha erken bir şekilde yürütecektir. Daha sonra yürütmek istiyorsanız öncelikli negatif yapabilirsiniz. Bu yardımcı olabilir. – jdharrison

+0

Önceliği -100'e ayarlıyorum ve hiçbir şey olmuyor – user3022875

cevap

8

En basit yol, kullandığı girişler başlatılmadan önce çalışmasını önlemek için her bir gözlemin başına bir is.null(input$Product) denetimi eklemektir.

Gözlemcilerinizin her çalıştırıldıklarında boş denetimi yapmasını istemiyorsanız, bunların çalışmasını önlemek için kaydederken suspended = TRUE bağımsız değişkenini de kullanabilirsiniz; daha sonra, denetimi gerçekleştiren ayrı bir gözlemci yazın ve tüm girdilerin boş olmadığını tespit ettiğinde, askıya alınmış gözlemcilerdeki özgeçmişini çağırır ve kendisini askıya alır.

10

Shiny Event Handler ürününü kullanmanız ve observe yerine observeEvent kullanmanız gerekir. Uygulama açılışında NULL değerlerinin neden olduğu "İşlenmemiş hata" mesajından kurtulmanın tek yolu hakkında görünüyor. Bu nedenle, observe'un aksine olay işleyicisi varsayılan olarak NULL değerleri göz ardı eder.

Yani böyle bir şey seyir bitebileceğini senin gözlemlemek fonksiyonu (öncelikler gerek veya özgeçmiş/vb askıya!)

observeEvent(input$Product, ({ 

    max_plots<-length(getTerm2UI(input$Desk, input$Product, input$File1)) 
    ... (etc)  

    })# end of the function to be executed whenever input$Product changes 
) 

bunu çalıştırmak yapmak için kolayca örnek kodu yapıştırın kopyalayamadık yüzden Tam gözlemleme fonksiyonunun nasıl görüneceğinden emin değilim.

0

Biz yapabildin, çalışan bir cevap sağlamak için bir MRE gerekir, ama, sen input$Product ve input$File1 gerek varsayarak, ancak yalnızca input$Desk üzerinde, üzerlerinde bir bağımlılık almak istemiyorum:

observe({ 

    product <- isolate(input$Product) 
    file1 <- isolate(input$File1) 

    print("in observe") 
    print(product) 
    max_plots<-length(getTerm2UI(input$Desk, product, file1)) 
    for (i in 1:max_plots) { 
    # ... 
    } 
}) 

Bu muhtemelen observeEvent(input$Desk, ....)'a eşdeğerdir, ancak daha fazla esneklik sunabilir.