繁体   English   中英

如何从R Shinyapp中的“ for”循环获取迭代输出?

[英]How to get iterative output from a “for” loop in R shinyapp?

我正在寻找一种解决方案,其中我们可以在R Shiny中打印单次迭代输出。 现在,当For循环结束工作时,我得到了输出(一堆文本输出)。 有什么方法可以将迭代输出从for循环打印到R闪亮主面板吗?

编辑1.这是示例代码,由于官方原因,我无法共享原始代码。 希望能帮助到你。

library(shiny)
library(shinydashboard)
library(shinythemes)
ui <- dashboardPage(
dashboardHeader(title = "LAP"),
dashboardSidebar( 
sidebarMenu(
  #menuItem("Introduction", tabName = "intro", icon = icon("info-circle")),
  menuItem("test", tabName = "FD", icon = icon("info-circle"))

)),

dashboardBody(
tabItems(
  tabItem(tabName = "FD",
          fluidRow(
            box(verbatimTextOutput("loc") )))
  )
 )
)
 server =shinyServer(function(input, output){

 mydata<- reactive({

for(i in 1:100){

  print("For Demo Purpose")

}

})

output$loc<- renderPrint({
mydata()
}) 
})

shinyApp(ui= ui, server = server)

我想到的最简单的方法是使用迭代函数将其追加到反应变量,然后在另一个输出元素中显示该变量。

只需将输出和生成分开。 当无功值改变时,输出元素将触发重新显示,但只要不修改任何变量,就不应引起奇数循环。

这是我最初尝试的示例,但无法正常运行:

## stub UI with an activation button and text output element
ui <- fluidPage(
   titlePanel("Iterative output demo"),
   sidebarLayout(
      sidebarPanel(
        actionButton("start","Start Program")
      ),
      mainPanel(
         textOutput("showProgressText")
      )
   )
)

## server stub
server <- function(input, output) {
   ## reactive list to store result values
   iterativeOutput <- reactiveValues();
   ## text rendering function `showProgressText`
   output$showProgressText <- renderText({
     sapply(iterativeOutput,paste);
   })
   ## iterative function; modifies the reactive list on each iteration
   observeEvent(input$start,{
     iterativeOutput <- reactiveValues(); # clear list
     for(i in 1:10){
       iterativeOutput[[as.character(i)]] <- 
         sprintf("%2d: For Demo Purpose\n", i);
       Sys.sleep(0.2);
     }
   })
}

此代码一次性输出修改后的信息,而不是对其进行更新。

我认为问题很可能是Shiny正在等待函数结束以检查反应性触发器。 这是因为,尽管有出现,Shiny仍不会并行运行操作。 使两件事情反复工作的唯一方法是破坏该功能,允许其他功能运行,然后恢复该功能。 这是Google网上论坛链接中提到的过程。

该链接中的第一个实现之所以有效,是因为将计时器设置为以一秒钟的间隔运行该功能的一次迭代。 这是一个替代实现,其中迭代功能仅在按下按钮时才[一次]更新:

## UI stub
ui <- fluidPage(
   titlePanel("Iterative output demo"),
   sidebarLayout(
      sidebarPanel(
        actionButton("start","Start Program")
      ),
      mainPanel(
         htmlOutput("showProgressText")
      )
   )
)

## Server stub
server <- function(input, output) {
   iterativeOutput <- reactiveValues();
   output$showProgressText <- renderText(
       paste0(sapply(reactiveValuesToList(iterativeOutput),paste), 
              collapse="<br />\n")
   )
   observeEvent(input$start,{
     #iterativeOutput <- reactiveValues(); # clear list
     i <- (input$start-1) %% 10;
     iterativeOutput[[as.character(i)]] <- 
       sprintf("%2d: %d", i, sample.int(1000, 1));
   })
}

insertUI方法很有趣,因为它在方法中间创建了一个单独的显示循环。 我可以想象,如果在各处使用该方法,Shiny代码将变得不那么简单和可预测。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM