2016-11-11 73 views
1

這是一個非常奇怪的行爲,在Shiny htmlOutput中使用循環。我一直在努力做的事情非常簡單,就是從Shiny htmlOuput執行一個Javascript代碼(console.log)並將循環編號輸出到控制檯。請參見下面的代碼:for循環閃爍htmlOutput不按順序執行

library(shiny) 
ui <- fluidPage(
    actionButton("goButton", "Go!"), 
    mainPanel(htmlOutput("result")) 
) 
server<- function(input, output) { 
    observeEvent(input$goButton,{ 
    output$result <- renderUI({ 
     html_output_list <- lapply(1:50, function(j) { 
     htmlname <- paste("html", j, sep="") 
     htmlOutput(htmlname) 
     }) 
     # Convert the list to a tagList - this is necessary for the list of items 
     # to display properly. 
     do.call(tagList, html_output_list) 
    }) 
    lapply(1:14, function(i){ 
     htmlname <- paste("html", i, sep="") 
     output[[htmlname]] <- reactive({ 
      paste('<script>number=', 
          i, 
          ';console.log(number);</script>') 
      }) 
     }) 
    }) 
} 
shinyApp(ui = ui, server = server) 

點擊Go按鈕,結果應該是從1到14的有序序列號(因爲我從循環1到14的數字),但實際結果是14.1, 2,...,13。嘗試從1:20的範圍我會產生一個序列爲(14,15,16,17,18,1,19,2,3,4,5,6,7,8,20,9,10,11 ,12,13)。任何人都可以解釋這裏發生了什麼?它如何不遵循命令?顯然這不是一個隨機順序。

回答

1

也許這可以幫助:

應用,R

library(shiny) 
    library(shinyjs) 
    ui <- tagList(
      useShinyjs(), 
      fluidPage(
      actionButton("goButton", "Go!"), 
      mainPanel(
        uiOutput("result") 
    ))) 
    server<- function(input, output) { 

      observeEvent(input$goButton, { 
       lapply(1:50, function(j){ 

         shinyjs::logjs(paste('number=', j)) 
        }) 

      }) 

    } 
    shinyApp(ui = ui, server = server) 
+0

這可以得到正確的答案,但它是從我的目的略有不同。在輸出之前,您通過將Javascript分配給數組(x)來完成循環。是否有可能在循環內輸出?我的代碼是要實現這一點,但執行不符合正確的順序。謝謝。 – uPhone

+0

嘗試與shinyjs包,與logjs函數。檢查修改的答案。 –