我有一个复杂的shiny 应用程序,它分布在多个文件中,使用多个包中的代码.在R Studio中本地运行时,该应用程序可以工作,但在我的服务器上,它会引发一个一般性错误:

错误:不知道如何将"x"转换为类"日期"

这可能是一个简单的编程错误,但要准确地找出代码中的错误是很困难的.

如何查找和修复shiny 应用程序中的错误源?有哪些工具可以系统地做到这一点?


关于类似的问题,在Google Groups上也有一些讨论.

推荐答案

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

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

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

library(shinyjs)

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

在你的服务器上.R、 将logjs添加到日志(log)处理程序列表中:

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打印一些东西.

Other Tips

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

  2. 将尽可能多的业务逻辑放入包和外部脚本中.无论何时,只要你怀疑它们会引发问题,就对它们进行单元测试.testthat美元的套餐在这里很有用.

  3. 如果希望变量满足某些约束,请添加断言.例如,如果x应该是zoo,那么把assert_that(is.zoo(x))放在你的react 式表顶部附近.

  4. 小心默认的drop行为.养成习惯,只要你想让结果变成data.frame,就指定drop = F.

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

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

  7. dput将允许您判断对象的内部 struct ,并且在try 在应用程序之外重现错误时非常有用.

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

  9. Never在非交互式代码中使用sapply.如果输出为空,它将无法推断出所需的类型并返回空值.如果你的结果应该是vector,使用vapply.如果你的结果应该是list,使用lapply.

你还应该看看RStudio团队的Debugging Shiny Applications个.

R相关问答推荐

在与ggplot 2和网格的最佳匹配线上绘制箭头

R dðr按时间间隔进行总结

在之前合并的数据.tables中分配新列后.internal.selfref无效

使用facet_wrap()时如何将面板标题转换为脚注?

为什么stat_bin在R中的ggplot中显示错误的数字?

R -模运算后的加法

将模拟变量乘以多个观测结果中的模拟变量

是否可以 Select 安装不带文档的R包以更有效地存储?

使用ggplot将平滑线添加到条形图

如何动态更新selectizeInput?

将包含卷的底部25%的组拆分为2行

从外部文件读取多个值作为字符向量

找出二叉树中每个 node 在R中的深度?

在使用tidyModels和XGBoost的二进制分类机器学习任务中,所有模型都失败

R中有约束的优化问题:如何用复数和对数效益函数解决问题?

在点图上绘制置信度或预测区间ggplot2

随机 Select 的非NA列的行均数

构建一个6/49彩票模拟系统

R try Catch in the loop-跳过缺少的值并创建一个DF,显示跳过的内容

如何在R中创建这些列?