【问题标题】:Force rsconnect::deployApp() to fail to test 'on.failure'强制 rsconnect::deployApp() 无法测试“on.failure”
【发布时间】:2020-10-07 17:42:36
【问题描述】:

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

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

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

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

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

# 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。搜索继续!

【问题讨论】:

    标签: r shiny rsconnect


    【解决方案1】:

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

    查看底层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 &lt;- NULL;deploymentSucceeded &lt;- FALSE 并继续代码。

    但是,查看代码,我们看到会发生的所有事情是,on.failure 被调用。所以直接调用on.failure也是一样的效果。

    【讨论】:

    • 那么如果on.failure 是我创建的函数,那么简单地测试该函数就足够了吗?至于debug(rsconnect:::openURL) 并设置其中的值,我会将它们包含到我闪亮的应用程序中然后尝试部署吗?抱歉,我对调试没有经验。
    • 是的。不,您在 R 命令 shell 中运行 debug(rsconnect:::openURL),然后运行部署功能。一旦函数调用openURL,您将看到在 R shell 中,您现在可以逐行运行openURL 的每一行,在每一行之后,R 停止并让您运行任何您想要的 R 代码并且您想要更改两个变量的值。参照adv-r.hadley.nz/debugging.html
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多