R Shiny - 顺序文本输出

3

在处理代码之前,我想先打印一段文本,然后在代码执行完毕后再打印确认信息。

这是我的代码(app.R 的用户界面和服务器):所有未指定的变量都在 app.R 文件中初始化。

ui <- fluidPage(
  # Application title
  titlePanel(h1("Order2Ship", align="center")),
  # Sidebar iputs
  sidebarLayout(
    sidebarPanel( #LONG LIST OF INPUTS
    ),
    # On Screen output
    mainPanel(
      textOutput("START"),
      textOutput("Confirm")
    )
  )
)
# Underlining code for output (computes the whole each time an input is changed)
server <- function(input, output) {
  observeEvent(input$Do, { # ignores all return values
    output$START <- renderText({"Starting Analysis"})
    O2S( #LONG LIST OF PARAMETERS, FROM INPUTS
    )
    output$Confirm <- renderText({"Analysis Done"})
  })
}
# Run the application
shinyApp(ui = ui, server = server)

我不需要函数O2S返回任何东西,它只需要一个文件作为输入并生成一个解决方案文件。但是,在函数运行后,两个文本输出同时显示。 我无法想出原因。我刚开始学习Shiny,所以对于这样一个幼稚的问题感到抱歉。


这是因为renderText函数既作为开始,又作为确认的函数,只有在函数运行后才被从服务器传递到UI界面。 - SBista
我明白,但我该如何修复它? - Arani
也许我漏看了什么,但当我运行你的应用程序时,我只看到了 Order2Ship。没有别的... - MLavoie
如果您在observeEvent函数之前首先使用renderText,会发生什么情况呢?这将按以下顺序运行代码:在mainPanel中显示“开始分析”文本;运行输入文件和生成解决方案文件的代码;最后显示“分析完成”。 - Sagar
@mlavoie 为了简短起见,省略了所需的数据和部分代码。创建一个O2S函数和一个操作按钮来执行,您可以复制该行为。 - Arani
@Sagar 那个可以。不过,我想要在按钮被按下后显示消息。无论如何,谢谢。我现在在 observeEvent 之前添加了一个“选择参数”的消息。 :) - Arani
1个回答

2

你可以使用shinyjs创建类似于以下内容的链式事件

library(shinyjs)
library(shiny)

ui <- fluidPage(
  # Application title
  titlePanel(h1("Order2Ship", align="center")),
  # Sidebar iputs
  sidebarLayout(
    sidebarPanel( #LONG LIST OF INPUTS
      actionButton(inputId = "Do",
                   label = "Start")
    ),
    # On Screen output
    mainPanel(
      textOutput("START"),
      textOutput("Confirm"),
      useShinyjs()
    )
  )
)
# Underlining code for output (computes the whole each time an input is changed)
server <- function(input, output) {
  startText <- eventReactive({input$Do},{
    runjs("Shiny.onInputChange('analysisStarted',Date.now())")
    "Starting Analysis"
  },
  ignoreInit = TRUE)
  output$START <- renderText({startText()})
  observeEvent(input$analysisStarted, { # ignores all return values
    temp <- NULL
    for(i in seq(50000)){
      temp <- c(temp,i)
    }
    runjs("Shiny.onInputChange('analysisFinished',true)")
  },
  ignoreInit = FALSE)
  confirmText <- eventReactive({input$analysisFinished},{
    "Analysis Done"
  },
  ignoreInit = FALSE)
  output$Confirm <- renderText({confirmText()})
}
# Run the application
shinyApp(ui = ui, server = server)

希望这能帮到你!

我明天会尝试并回复你。谢谢。 - Arani
它起作用了。谢谢。你能解释一下它是如何工作的吗?据我所知,runjs正在创建某种标志,但为什么在Shiny.onInputChange函数中我们有一次使用Date.now(),另一次使用true?此外,为什么要使用true而不是TRUE?这是因为它是用JavaScript编写的吗? - Arani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接