有效调试Shiny应用程序

sdg*_*sdh 34 debugging r shiny

我有一个复杂的Shiny应用程序,分布在多个文件中,使用来自多个软件包的代码.该应用程序在R Studio中本地运行时有效,但在我的服务器上它会抛出一般错误:

错误:不知道如何将'x'转换为类"Date"

这可能是一个简单的编程错误,但确定错误在代码中的确切位置证明是困难的.

我怎样才能找到并修复Shiny应用程序中的错误来源?有哪些工具可以系统地完成这项工作?


Google网上论坛存在类似问题的一些讨论.

sdg*_*sdh 48

您可以使用的组合在服务器上实现日志记录loggingshinyjs.

install.packages("logging")
install.packages("shinyjs")
Run Code Online (Sandbox Code Playgroud)

在你的ui.R中,绑定shinyjs使用shinyjs::useShinyjs:

library(shinyjs)

shinyUI(
    fluidPage(
        useShinyjs(),
# etc...
Run Code Online (Sandbox Code Playgroud)

在您的server.R中,添加logjs到日志处理程序列表:

library(magrittr)
library(shinyjs)
library(logging)

basicConfig()

options(shiny.error = function() { 
    logging::logerror(sys.calls() %>% as.character %>% paste(collapse = ", ")) })

shinyServer(function(input, output, session) {

    printLogJs <- function(x, ...) {

        logjs(x)

        T
    }

    addHandler(printLogJs)
# etc...
Run Code Online (Sandbox Code Playgroud)

然后打印一些东西,使用loginfo.

其他提示

  1. 在本地运行应用程序时,例如从RStudio运行,使用options(shiny.error = browser)options(shiny.error = recover)识别错误来源.

  2. 尽可能多地将业务逻辑放入包和外部脚本中.每当您怀疑它们导致问题时,对这些进行单元测试.这个testthat包可以帮到这里.

  3. 如果您希望变量满足某些约束,请添加一个断言.例如,如果x应该是一个zoo,放在assert_that(is.zoo(x))你的反应顶部附近.

  4. 注意默认drop行为.养成drop = F每当你想要你的结果时指定的习惯data.frame.

  5. 尽量减少代码单元所依赖的变量(选项,环境,缓存,UI状态等)的数量.弱类型语言已经足够难以调试了!

  6. 尽可能使用适当的S4和S3类而不是原始R结构.

  7. dput 将允许您检查对象的内部结构,并且在尝试重现应用程序之外的错误时非常有用.

  8. 尝试在交互式控制台中进行调试,而不是print在应用程序内部使用.这将允许您更快地迭代.在无法在应用程序外部进行调试时,请尝试browser()在问题代码之前拨打电话.

  9. 切勿使用sapply在非交互的代码.如果输出为空,则无法推断出所需的类型并返回空list.如果您的结果应该是a vector,请使用vapply.如果您的结果应该是a list,请使用lapply.

您还应该查看来自RStudio团队的Debugging Shiny Applications.


dra*_*doc 10

我很惊讶没有提到RStudio Shiny调试文章.那篇文章在调试和错误处理方面非常彻底.

您可以检查服务器的日志,这应该更直接地解决OP提出的问题.


mau*_*ice 6

日期问题:服务器端可能使用不同的操作系统,具有不同的默认字符集编码(例如“latin1”、“utf-8”)。有时,在 R 中加载数据会丢失编码。函数 read.csv 有一个参数 encoding="UTF-8",您可以使用它。

为了调试,我依赖于打印语句。我也很想知道其他人是否找到了更系统的方法。

  • 打印语句将显示在 R 控制台中。虽然是基本的,但简单的“到了这部分”和“到了那部分”语句帮助我进行了调试。我正在使用 RStudio,并运行 runApp() 在 Chrome 浏览器中显示该应用程序。 (2认同)