有效调试Shiny应用程序

时间:2015-08-10 13:00:37

标签: r debugging shiny

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

  

错误:不知道如何转换' x'上课"日期"

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

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

Google Groups对类似问题进行了一些讨论。

3 个答案:

答案 0 :(得分:46)

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

install.packages("logging")
install.packages("shinyjs")

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

library(shinyjs)

shinyUI(
    fluidPage(
        useShinyjs(),
# etc...

在您的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...

然后要打印某些内容,请使用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。如果您的结果应为vector,请使用vapply。如果您的结果应为list,请使用lapply

  10. 您还应该从RStudio团队查看Debugging Shiny Applications

答案 1 :(得分:9)

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

您可以查看服务器的日志,这可以更直接地解决OP提出的问题。

答案 2 :(得分:3)

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

要进行调试,我依赖于print语句。我也有兴趣知道其他人是否找到了更系统的方法。