将闪亮的应用程序称为R中的函数的一部分

时间:2016-06-09 23:50:06

标签: r shiny

我工作目录中的文件app.R包含一个Shiny app:

shinyApp(
   ui = fluidPage(
    textInput("name", "Write your name", value = "stranger"),
    verbatimTextOutput("greeting")
  ),
  server = function(input, output) {
    output$greeting <- renderPrint({
      greeting <- paste("Hi,", input$name) 
      greeting
    })
  }
)

我想从R中的一个函数中调用此应用程序,然后退出应用程序并让R执行该函数的其余部分。该函数如下所示:

hi.app <- function() {
  library(shiny)
  shiny::runApp("app.R")
  print("Finished.")
}

应用程序在运行hi.app()时打开,但当我关闭应用程序窗口时,该函数会调用调试器:

  

来自:Sys.sleep(0.001)

期望的行为:

  1. 运行hi.app()
  2. 关闭应用窗口
  3. print [1] "Finished"

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题,但是,不需要使用小工具。仍然可以使用shinyApp函数,包括stopApp函数。以下示例突出显示了两个选项:

  1. 添加&#39;完成&#39;应用中的按钮可停止该应用。
  2. 使用服务器会话来捕获onSessionEnded
  3. 以下是代码:

    rm(list=ls())
    
    library(shiny)
    
    doshiny <- function() {
      app=shinyApp(
        ui = fluidPage(
          textInput("name", "Write your name", value = "stranger"),
          actionButton("ending","Done"),
          verbatimTextOutput("greeting")
        ),
        server = function(input, output, session) {
          output$greeting <- renderPrint({
            greeting <- paste("Hi,", input$name) 
            greeting
          })
          observeEvent(input$ending, {
            stopApp()
          })
          session$onSessionEnded(function() {
            stopApp()
          })
        }
      )
      runApp(app)
    }
    
    say_hi <- function() {
      doshiny()
      print("Finished.")
    }
    
    say_hi()