sdg*_*sdh 34 debugging r shiny
我有一个复杂的Shiny应用程序,分布在多个文件中,使用来自多个软件包的代码.该应用程序在R Studio中本地运行时有效,但在我的服务器上它会抛出一般错误:
错误:不知道如何将'x'转换为类"Date"
这可能是一个简单的编程错误,但确定错误在代码中的确切位置证明是困难的.
我怎样才能找到并修复Shiny应用程序中的错误来源?有哪些工具可以系统地完成这项工作?
对Google网上论坛存在类似问题的一些讨论.
sdg*_*sdh 48
您可以使用的组合在服务器上实现日志记录logging
和shinyjs
.
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
.
其他提示
在本地运行应用程序时,例如从RStudio运行,使用options(shiny.error = browser)
或options(shiny.error = recover)
识别错误来源.
尽可能多地将业务逻辑放入包和外部脚本中.每当您怀疑它们导致问题时,对这些进行单元测试.这个testthat
包可以帮到这里.
如果您希望变量满足某些约束,请添加一个断言.例如,如果x
应该是一个zoo
,放在assert_that(is.zoo(x))
你的反应顶部附近.
注意默认drop
行为.养成drop = F
每当你想要你的结果时指定的习惯data.frame
.
尽量减少代码单元所依赖的变量(选项,环境,缓存,UI状态等)的数量.弱类型语言已经足够难以调试了!
尽可能使用适当的S4和S3类而不是原始R结构.
dput
将允许您检查对象的内部结构,并且在尝试重现应用程序之外的错误时非常有用.
尝试在交互式控制台中进行调试,而不是print
在应用程序内部使用.这将允许您更快地迭代.在无法在应用程序外部进行调试时,请尝试browser()
在问题代码之前拨打电话.
切勿使用sapply
在非交互的代码.如果输出为空,则无法推断出所需的类型并返回空list
.如果您的结果应该是a vector
,请使用vapply
.如果您的结果应该是a list
,请使用lapply
.
您还应该查看来自RStudio团队的Debugging Shiny Applications.
日期问题:服务器端可能使用不同的操作系统,具有不同的默认字符集编码(例如“latin1”、“utf-8”)。有时,在 R 中加载数据会丢失编码。函数 read.csv 有一个参数 encoding="UTF-8",您可以使用它。
为了调试,我依赖于打印语句。我也很想知道其他人是否找到了更系统的方法。