1

我有一个shiny应用程序,它每晚通过rsconnect::deployApp使用批处理文件和计划任务进行更新。此过程当前按预期运行,但目前确认整个过程成功的唯一方法是访问应用程序并检查时间戳是否已更新。

?deployApp显示一个on.failure选项,如果部署失败,它将调用一个函数。如果部署失败,我知道如何使用它来发送通知,但我无法对其进行测试,因为我实际上无法使deployApp函数失败。

UI尽管在查看器和 shinyapps.io 上不起作用,但我尝试在应用程序中放置错误,但应用程序成功部署。

有没有办法强制deployApp函数失败,以便我能够测试on.failure我正在创建的函数?

如果需要,这是从这里借来的一个闪亮的小应用程序。

# Global variables can go here
n <- 200


# Define the UI
ui <- bootstrapPage(
  numericInput('n', 'Number of obs', n),
  plotOutput('plot')
)


# Define the server code
server <- function(input, output) {
  output$plot <- renderPlot({
    hist(runif(input$n))
  })
}

# Return a Shiny app object
shinyApp(ui = ui, server = server)

当前运行 R v. 4.0.2;rsconnect 0.8.16,闪亮的 1.5.0

编辑:我尝试偷偷q()进入应用程序。它肯定会破坏应用程序,但不会干扰deployApp. 搜索继续!

4

1 回答 1

1

我的猜测是,on.failure当部署中出现错误时会发生火灾。从这个角度来看,代码中的错误(stop甚至)只有在篡改部署q时才会触发。由于没有对代码本身的明显检查,它可能不会像这样工作。on.failuredeployApp

查看底层rsconnect:::openURL(使用on.failure参数的地方),我们看到它on.failure在两种情况下使用:

if (!is.null(client$configureApplication)) {
    config <- client$configureApplication(application$id)
    url <- config$config_url
    if (!deploymentSucceeded && validURL(config$logs_url)) {
        url <- config$logs_url
    }
    if (validURL(url)) {
        if (deploymentSucceeded) {
            showURL(url)
        }
        else if (is.function(on.failure)) {
            on.failure(url) ## here
        }
    }
}
else if (deploymentSucceeded) {
    showURL(application$url)
}
else if (is.function(on.failure)) {
    on.failure(NULL) ## and here
}

所以我要测试的是debug(rsconnect:::openURL),当浏览器打开时,我只需设置client$configureApplication <- NULL;deploymentSucceeded <- FALSE并继续代码。

但是,查看代码,我们看到所有会发生的事情就是on.failure被调用。因此,直接调用on.failure将具有相同的效果。

于 2020-10-08T16:31:40.543 回答