我正在寻找一种解决方案,我们可以在R shine中打印单次迭代输出。现在,当For循环结束它的工作时,我得到了输出(一堆文本输出)。有没有办法从for循环中将itrative输出打印到R shiny mainpanel?
编辑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)
答案 0 :(得分:0)
我能想到的最简单的方法是使用迭代函数追加到一个反应变量,并在另一个输出元素中显示该变量。
保持输出和生成分开。当无功值发生变化时,输出元素将触发重新显示,但只要它不修改任何变量,就不会导致奇数循环发生。
这是我最初尝试的一个例子,它没有正常工作:
## 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 groups link中提到的过程。
该链接中的第一个实现是有效的,因为定时器设置为以一秒的间隔运行该函数的一次迭代。这是一个替代实现,其中迭代函数仅在按下按钮时[一次]更新:
## 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
方法很有趣,因为它在方法的中间创建了一个单独的显示循环。我可以想象,如果在整个地方使用这种方法,那么闪亮的代码变得不那么简单和可预测。