![](/img/trans.png)
[英]How to upload folder of text files in ShinyApp to get Document Term Matrix from Corpus of files in R?
[英]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.