2016-11-11 2 views
1

Это действительно странное поведение для использования цикла внутри Shiny htmlOutput. То, что я пытаюсь сделать, очень просто, выполнить Javascript-код (console.log) из Shiny htmlOuput и напечатать номер цикла на консоли. См код ниже:для цикла в Shiny 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) 

При нажатии на кнопку идти, результат должен быть упорядоченный номером последовательности от 1 до 14 (как число петель я от 1 до 14), но фактический исход 14,1, 2, ..., 13. Попробуйте диапазон i из 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. Проверьте измененный ответ. –

Смежные вопросы